1 Brief explanation

Every boxplot means a monitoring point (Ponto de monitoramento (or PM) in portuguese). My goal here is to analyze the evolution between decades of each water quality parameter that compounds the Water Quality Index (WQI).

The river flows in the east-west direction as shown in the image below.

The logic behind the sorting in the boxplots is because of 2 main reasons:

  1. The original monitoring point isn’t easy to understand (8 digits, like 87409900)
  2. Changing the original nomenclature to PM1, PM2 (…) makes it easier to understand that the last point has water contributions of every other point upstream.

Some features that I want to add: - If the parameter is x, then use x’s classes (with its own classes background color plotted) - Define the timescale, should act just like a filter

# plan_wide_19902020 %>%
#   filter(ANO_COLETA > "1990" &
#          ANO_COLETA <= "2000")

2 Anotações de coisas por fazer:

  • Descobrir como colocar as estações no sentido correto montante -> jusante nos sumários

87398500, 87398980, 87398900, 87398950, 87405500, 87406900, 87409900

  • Aprender a segmentar o meu dataset por períodos
  • aprender a criar uma nova coluna com a segmentação dos períodos
  • maybe use ~facet.grid
  • aprender a colocar a legenda dentro do gráfico
    • reduzir o tamanho da legenda
  • corrigir os valores 0 de IQA pra NA
  • descobrir como conseguir a equação do lm
  • aprender a pivotar o sumário -> meu sumário do google docs ta batendo direitinho com o do R
  • descobrir se há outros TCCs com disponibilização de códigos
  • Namon tá com com casa decimal "," e ptot tá com "."
  • correlação forte entre condutividade e Namon/Ptot/DBO
1990-2000 2000-2010 2010-2020
1990-2000 2000-2010 2010-2020

3 Instalar os pacotes

# install.packages(tidyverse)

3.1 acessar os pacotes

# library(readr)
# library(rmarkdown)
# # library(qboxplot)
# library(readxl)
# library(pillar)
# library(dplyr)
# library(tidyverse)
# library(gapminder)
# library(knitr)
# library(kableExtra)
# library(ggpubr)
# library(gridExtra)
# library(modelsummary)
# library(gtsummary)
# library(GGally)
pacman::p_load(readr, rmarkdown, readxl,
               pillar, dplyr, tidyverse,
               gapminder, knitr, kableExtra,
               gridExtra, #modelsummary, 
               gtsummary, ggplot2,
               ggbeeswarm, GGally,
               report)
# pacman::p_load(tibbletime)
cite_packages()
##   - Allaire J, Xie Y, McPherson J, Luraschi J, Ushey K, Atkins A, WickhamH, Cheng J, Chang W, Iannone R (2022). _rmarkdown: Dynamic Documentsfor R_. R package version 2.14, <URL:https://github.com/rstudio/rmarkdown>.Xie Y, Allaire J, Grolemund G (2018). _R Markdown: The DefinitiveGuide_. Chapman and Hall/CRC, Boca Raton, Florida. ISBN 9781138359338,<URL: https://bookdown.org/yihui/rmarkdown>.Xie Y, Dervieux C, Riederer E (2020). _R Markdown Cookbook_. Chapmanand Hall/CRC, Boca Raton, Florida. ISBN 9780367563837, <URL:https://bookdown.org/yihui/rmarkdown-cookbook>.
##   - Auguie B (2017). _gridExtra: Miscellaneous Functions for "Grid"Graphics_. R package version 2.3, <URL:https://CRAN.R-project.org/package=gridExtra>.
##   - Bryan J (2017). _gapminder: Data from Gapminder_. R package version0.3.0, <URL: https://CRAN.R-project.org/package=gapminder>.
##   - Clarke E, Sherrill-Mix S (2017). _ggbeeswarm: Categorical Scatter(Violin Point) Plots_. R package version 0.6.0, <URL:https://CRAN.R-project.org/package=ggbeeswarm>.
##   - Henry L, Wickham H (2020). _purrr: Functional Programming Tools_. Rpackage version 0.3.4, <URL: https://CRAN.R-project.org/package=purrr>.
##   - Makowski D, Ben-Shachar M, Patil I, Lüdecke D (2021). "AutomatedResults Reporting as a Practical Tool to Improve Reproducibility andMethodological Best Practices Adoption." _CRAN_. <URL:https://github.com/easystats/report>.
##   - Müller K, Wickham H (2021). _tibble: Simple Data Frames_. R packageversion 3.1.1, <URL: https://CRAN.R-project.org/package=tibble>.
##   - Müller K, Wickham H (2022). _pillar: Coloured Formatting for Columns_.R package version 1.8.0, <URL:https://CRAN.R-project.org/package=pillar>.
##   - R Core Team (2020). _R: A Language and Environment for StatisticalComputing_. R Foundation for Statistical Computing, Vienna, Austria.<URL: https://www.R-project.org/>.
##   - Schloerke B, Cook D, Larmarange J, Briatte F, Marbach M, Thoen E,Elberg A, Crowley J (2021). _GGally: Extension to 'ggplot2'_. R packageversion 2.1.2, <URL: https://CRAN.R-project.org/package=GGally>.
##   - Sjoberg D, Curry M, Hannum M, Larmarange J, Whiting K, Zabor E (2021)._gtsummary: Presentation-Ready Data Summary and Analytic ResultTables_. R package version 1.4.0, <URL:https://CRAN.R-project.org/package=gtsummary>.
##   - Wickham H (2016). _ggplot2: Elegant Graphics for Data Analysis_.Springer-Verlag New York. ISBN 978-3-319-24277-4, <URL:https://ggplot2.tidyverse.org>.
##   - Wickham H (2019). _stringr: Simple, Consistent Wrappers for CommonString Operations_. R package version 1.4.0, <URL:https://CRAN.R-project.org/package=stringr>.
##   - Wickham H (2021). _forcats: Tools for Working with CategoricalVariables (Factors)_. R package version 0.5.1, <URL:https://CRAN.R-project.org/package=forcats>.
##   - Wickham H, Averick M, Bryan J, Chang W, McGowan LD, François R,Grolemund G, Hayes A, Henry L, Hester J, Kuhn M, Pedersen TL, Miller E,Bache SM, Müller K, Ooms J, Robinson D, Seidel DP, Spinu V, TakahashiK, Vaughan D, Wilke C, Woo K, Yutani H (2019). "Welcome to thetidyverse." _Journal of Open Source Software_, *4*(43), 1686. doi:10.21105/joss.01686 (URL: https://doi.org/10.21105/joss.01686).
##   - Wickham H, Bryan J (2019). _readxl: Read Excel Files_. R packageversion 1.3.1, <URL: https://CRAN.R-project.org/package=readxl>.
##   - Wickham H, François R, Henry L, Müller K (2022). _dplyr: A Grammar ofData Manipulation_. R package version 1.0.9, <URL:https://CRAN.R-project.org/package=dplyr>.
##   - Wickham H, Girlich M (2022). _tidyr: Tidy Messy Data_. R packageversion 1.2.0, <URL: https://CRAN.R-project.org/package=tidyr>.
##   - Wickham H, Hester J, Bryan J (2022). _readr: Read Rectangular TextData_. R package version 2.1.2, <URL:https://CRAN.R-project.org/package=readr>.
##   - Xie Y (2022). _knitr: A General-Purpose Package for Dynamic ReportGeneration in R_. R package version 1.39, <URL:https://yihui.org/knitr/>.Xie Y (2015). _Dynamic Documents with R and knitr_, 2nd edition.Chapman and Hall/CRC, Boca Raton, Florida. ISBN 978-1498716963, <URL:https://yihui.org/knitr/>.Xie Y (2014). "knitr: A Comprehensive Tool for Reproducible Research inR." In Stodden V, Leisch F, Peng RD (eds.), _Implementing ReproducibleComputational Research_. Chapman and Hall/CRC. ISBN 978-1466561595,<URL: http://www.crcpress.com/product/isbn/9781466561595>.
##   - Zhu H (2021). _kableExtra: Construct Complex Table with 'kable' andPipe Syntax_. R package version 1.3.4, <URL:https://CRAN.R-project.org/package=kableExtra>.
knitr::knit_hooks$set(time_it = local({
   now <- NULL
   function(before, options) {
      if (before) {
         # record the current time before each chunk
         now <<- Sys.time()
      } else {
         # calculate the time difference after a chunk
         res <- difftime(Sys.time(), now)
         # return a character string to show the time
         paste("Time for this code chunk to run:", res)
      }
   }
}))

knitr::opts_chunk$set(time_it = TRUE)

3.1.1 referenciando os pacotes

version$version.string
## [1] "R version 3.6.3 (2020-02-29)"
citation(package = "tidyverse")
## 
##   Wickham et al., (2019). Welcome to the tidyverse. Journal of Open
##   Source Software, 4(43), 1686, https://doi.org/10.21105/joss.01686
## 
## A BibTeX entry for LaTeX users is
## 
##   @Article{,
##     title = {Welcome to the {tidyverse}},
##     author = {Hadley Wickham and Mara Averick and Jennifer Bryan and Winston Chang and Lucy D'Agostino McGowan and Romain François and Garrett Grolemund and Alex Hayes and Lionel Henry and Jim Hester and Max Kuhn and Thomas Lin Pedersen and Evan Miller and Stephan Milton Bache and Kirill Müller and Jeroen Ooms and David Robinson and Dana Paige Seidel and Vitalie Spinu and Kohske Takahashi and Davis Vaughan and Claus Wilke and Kara Woo and Hiroaki Yutani},
##     year = {2019},
##     journal = {Journal of Open Source Software},
##     volume = {4},
##     number = {43},
##     pages = {1686},
##     doi = {10.21105/joss.01686},
##   }

Time for this code chunk to run: 0.0190639495849609

3.2 importando a planilha

## Rows: 1,179
## Columns: 53
## $ CODIGO              <chr> "87398950", "87398900", "87405500", "87398950", "8~
## $ MUNICIPIO           <chr> "GRAVATAI - RS", "GRAVATAI - RS", "CACHOEIRINHA - ~
## $ ENDERECO            <chr> "A PE NO TREVO, NA PONTE VELHA OU DE BARCO VINDO D~
## $ COORD_GEO_LAT_GRAU  <dbl> -51.00064, -50.93414, -51.11733, -51.00064, -50.93~
## $ COORD_GEO_LONG_GRAU <dbl> -29.95055, -29.95075, -29.95055, -29.95055, -29.95~
## $ Altitude            <dbl> 7, 6, 6, 7, 6, 7, 9, 9, 6, 6, 6, 6, 7, 6, 7, 6, 13~
## $ RECURSO_HIDRICO     <chr> "RIO GRAVATAI", "RIO GRAVATAI", "RIO GRAVATAI", "R~
## $ DATA_COLETA         <date> 1994-12-08, 1994-02-03, 1994-02-03, 1993-10-06, 1~
## $ ANO_COLETA          <dbl> 1994, 1994, 1994, 1993, 1994, 1995, 1994, 1995, 19~
## $ Alcalinidade        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ Condutividade       <dbl> 90.0, 47.0, 147.0, 43.0, NA, 47.0, 70.0, 60.6, 72.~
## $ DBO                 <dbl> 5, 5, 11, 3, 3, 2, 4, 3, 4, 2, 5, 3, 1, 1, 5, 2, 2~
## $ IQA_DBO             <dbl> 53.97, 53.97, 29.03, 69.06, 69.06, 78.12, 61.05, 6~
## $ DQO                 <dbl> 26, 47, 34, 37, 54, 23, 35, 25, 28, 40, 21, 35, 21~
## $ E_coli              <dbl> 4.0, 40.0, 12.8, 10.4, 32.0, 16.8, 40.0, 6.4, 10.4~
## $ fosfato_orto        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ fosforo_total       <dbl> 0.1130, 0.0883, 0.3530, 0.0908, 0.1180, 0.0326, 0.~
## $ IQA_Ptot            <dbl> 72.73, 77.95, 38.26, 77.41, 71.71, 91.16, 63.37, 6~
## $ Nitrato             <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ Nitrito             <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ nitro_organico      <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ nitro_amon          <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ nitro_kjeldahl      <dbl> 1.42, 1.61, 6.62, 0.79, 1.45, 0.76, 1.23, 1.37, 2.~
## $ nitro_total         <dbl> 1.42, 1.61, 6.62, 0.79, 1.45, 0.76, 1.23, 1.37, 2.~
## $ IQA_NitroTot        <dbl> 89.02, 87.64, 59.33, 93.74, 88.80, 93.97, 90.41, 8~
## $ oxigenio_dissolvido <dbl> 6.5, 8.7, 5.3, 7.8, 7.6, 8.5, 7.3, 6.9, 6.7, 6.3, ~
## $ sat_OD              <dbl> 78.162, 116.280, 70.837, 85.270, 96.442, 85.565, 7~
## $ IQA_OD              <dbl> 84.58, 90.92, 76.25, 89.67, 97.53, 89.88, 79.57, 7~
## $ pH                  <dbl> 6.9, 6.8, 6.6, 6.4, 6.9, 6.7, 6.6, 6.7, 6.3, 7.1, ~
## $ IQA_pH              <dbl> 89.76, 87.72, 82.86, 76.96, 89.76, 85.42, 82.86, 8~
## $ SDT                 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ SST                 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ temp_agua           <dbl> 25.0, 31.0, 31.0, 20.0, 28.0, 16.0, 16.0, 16.0, 18~
## $ temp_ar             <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ transparencia_agua  <dbl> NA, 40.0, 30.0, NA, NA, NA, 50.0, 20.0, 40.0, 20.0~
## $ turbidez            <dbl> 20.0, 20.0, 8.5, 23.0, 19.0, 17.0, 12.0, 22.0, 17.~
## $ IQA_Turb            <dbl> 61.87, 61.87, 80.20, 58.73, 63.07, 65.69, 73.57, 5~
## $ vazao_rio           <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ Vazao               <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA~
## $ coliformes_termo    <dbl> 5, 50, 16, 13, 40, 21, 50, 8, 13, 23, 700, 16, 8, ~
## $ IQA_coli            <dbl> 76.58, 47.21, 60.44, 63.04, 49.66, 57.12, 47.21, 6~
## $ solidos_totais      <dbl> 121, 112, 160, 93, 127, 75, 80, 201, 84, 123, 78, ~
## $ IQA_Sól_Tot         <dbl> 83.91, 84.69, 79.40, 85.78, 83.28, 86.08, 86.07, 7~
## $ `IQA_^OD`           <dbl> 2.126, 2.153, 2.089, 2.148, 2.178, 2.148, 2.104, 2~
## $ `IQA_^temp_agua`    <dbl> 1.58, 1.58, 1.58, 1.58, 1.58, 1.58, 1.58, 1.58, 1.~
## $ `IQA_^coli`         <dbl> 1.917, 1.783, 1.850, 1.862, 1.796, 1.835, 1.783, 1~
## $ `IQA_^pH`           <dbl> 1.715, 1.711, 1.699, 1.684, 1.715, 1.705, 1.699, 1~
## $ `IQA_^DBO`          <dbl> 1.175, 1.175, 1.271, 1.116, 1.116, 1.072, 1.149, 1~
## $ `IQA_^NitroTot`     <dbl> 1.567, 1.564, 1.504, 1.575, 1.566, 1.575, 1.569, 1~
## $ `IQA_^Ptot`         <dbl> 1.535, 1.546, 1.440, 1.545, 1.533, 1.570, 1.514, 1~
## $ `IQA_^Turb`         <dbl> 1.391, 1.391, 1.420, 1.385, 1.393, 1.398, 1.410, 1~
## $ `IQA_^Sól_Tot`      <dbl> 1.425, 1.426, 1.419, 1.428, 1.424, 1.428, 1.428, 1~
## $ IQA                 <dbl> 61.876, 58.452, 57.556, 57.129, 56.405, 56.189, 55~

Time for this code chunk to run: 0.427412986755371

Time for this code chunk to run: 0.220990180969238

4 data wrangling

# Como há dados faltantes, no cálculo entre o produto das colunas, ele acaba interpretando como se fosse zero, mas na verdade é NA
plan_wide_19902020 <- plan_wide_19902020 %>% 
   mutate(IQA = ifelse(IQA == 0, NA, IQA))

parametros_IQA <- plan_wide_19902020 %>%
  select(CODIGO,
         pH,
         DBO,
         E_coli,
         nitro_amon,
         nitro_kjeldahl,
         nitro_total,
         fosforo_total,
         temp_agua,
         turbidez,
         solidos_totais,
         oxigenio_dissolvido,
         Condutividade,
         ANO_COLETA)

write.csv(parametros_IQA,
          "./parametros_IQA.csv",
          row.names = FALSE)

plan_wide_19902020 %>% 
  select(starts_with("IQA_^")) %>% 
  mutate(
    TESTANDOIQA = prod()
  )
## # A tibble: 1,179 x 10
##    `IQA_^OD` IQA_^temp~1 IQA_^~2 IQA_^~3 IQA_^~4 IQA_^~5 IQA_^~6 IQA_^~7 IQA_^~8
##        <dbl>       <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1      2.13        1.58    1.92    1.72    1.18    1.57    1.54    1.39    1.42
##  2      2.15        1.58    1.78    1.71    1.18    1.56    1.55    1.39    1.43
##  3      2.09        1.58    1.85    1.70    1.27    1.50    1.44    1.42    1.42
##  4      2.15        1.58    1.86    1.68    1.12    1.58    1.54    1.38    1.43
##  5      2.18        1.58    1.80    1.72    1.12    1.57    1.53    1.39    1.42
##  6      2.15        1.58    1.84    1.70    1.07    1.58    1.57    1.40    1.43
##  7      2.10        1.58    1.78    1.70    1.15    1.57    1.51    1.41    1.43
##  8      2.08        1.58    1.89    1.70    1.12    1.57    1.52    1.39    1.41
##  9      2.09        1.58    1.86    1.68    1.15    1.56    1.49    1.40    1.43
## 10      2.13        1.58    1.83    1.72    1.07    1.57    1.55    1.38    1.42
## # ... with 1,169 more rows, 1 more variable: TESTANDOIQA <dbl>, and abbreviated
## #   variable names 1: `IQA_^temp_agua`, 2: `IQA_^coli`, 3: `IQA_^pH`,
## #   4: `IQA_^DBO`, 5: `IQA_^NitroTot`, 6: `IQA_^Ptot`, 7: `IQA_^Turb`,
## #   8: `IQA_^Sól_Tot`
## # i Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names
# library(performance)
# modelo <- plan_wide_19902020 %>% 
#   select(CODIGO, oxigenio_dissolvido, periodo) %>% 
#   group_by(CODIGO, periodo) %>% 
#   lm() %>% 
#   performance::check_distribution()
# # lm()
# 
# check_model(modelo)
# performance::check_autocorrelation(modelo)

Time for this code chunk to run: 0.113374948501587

Time for this code chunk to run: 0.00200605392456055

Time for this code chunk to run: 0.00300884246826172

5 setting theme

theme_grafs <- function(bg = "white", 
                        coloracao_letra = "black") {
  theme(
    plot.title = 
      element_text(
        hjust = 0.5,
        color = coloracao_letra,
        size = 19),
    
    axis.title.x = 
      # element_text(
      # color = coloracao_letra,
      # size = 15,
      # angle = 0,),
      element_blank(),
    axis.title.y = element_text(
      color = coloracao_letra,
      size = 15,
      angle = 90),
    
    axis.text.x = element_text(
      color = coloracao_letra,
      size = 17),
    axis.text.y = element_text(
      color = coloracao_letra,
      size = 17,
      angle = 0),
    
    strip.background = element_rect(fill = bg,
                                    linetype = 1,
                                    size = 0.5,
                                    color = "black"),
    strip.text = element_text(size = 17),
    panel.background = element_rect(fill = bg),
    plot.background = element_rect(fill = bg),
    plot.margin = margin(l = 5, r = 10,
                         b = 5, t = 5)
  )
}

Time for this code chunk to run: 0.00501298904418945

6 setting different timescales

Time for this code chunk to run: 0.0080258846282959

7 setting sumaries

Time for this code chunk to run: 0.00702309608459473

8 criando função para gerar boxplots com percentil 20 e 80

f <- function(x) {
  r <- quantile(x, probs = c(0.10, 0.20, 0.50, 0.80, 0.90))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  return(r)
}

Time for this code chunk to run: 0.00501585006713867

9 Parâmetros físico-químicos

9.0.1 Oxigênio Dissolvido

Oxigênio Dissolvido no período 1990-2020Time for this code chunk to run: 1.54082608222961

Oxigênio Dissolvido no período 1990-2000Time for this code chunk to run: 0.645132780075073

Time for this code chunk to run: 0.560148954391479

Time for this code chunk to run: 0.594969034194946

grid.arrange(od_p1, od_p2, od_p3, ncol = 3)

Oxigênio Dissolvido no período 1990-2020Time for this code chunk to run: 1.59897494316101

# ggsave("od.png",
#        units = c("px"),
#        width = 4500,
#        height = 2993,
#        plot = od,
#        path = "./graficos",
#        dpi = 300,
#        type = "cairo")

ggsave("od_p1.png",
       plot = od_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("od_p2.png",
       plot = od_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("od_p3.png",
       plot = od_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("od_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(od_p1, od_p2, od_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 4.37175107002258

Time for this code chunk to run: 0.00602102279663086

Time for this code chunk to run: 0.598982095718384

Time for this code chunk to run: 0.610336065292358

Time for this code chunk to run: 0.557845830917358

grid.arrange(iqaod_p1, iqaod_p2, iqaod_p3, ncol = 3)

Time for this code chunk to run: 2.58452606201172

## # A tibble: 7 x 8
##   par       PM1    PM2   PM3   PM4   PM5   PM6   PM7
##   <chr>   <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 max     10.8   10.5  10.3  12.1  19.9  10.2  11.1 
## 2 q3       7.3    8     7.1   8.2   6     5     5.65
## 3 median   6.4    6.9   5.95  6.3   4.2   2.6   2.9 
## 4 mean     5.99   6.78  5.98  7.01  4.22  2.98  3.60
## 5 q1       4.9    5.6   4.4   6     1.9   0.25  1.4 
## 6 min      0.8    2     2.5   4.2   0.1   0.1   0.1 
## 7 n      101    101    68    30    97    32    65
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   0.4   3.5   4.9   5.01  6.65  10.9
## 2 87398900   1.9   4     5.5   5.33  6.6   12  
## 3 87398950   1.7   3.2   5.3   5.06  6.18   8.9
## 4 87398980   1.2   3.8   5.6   5.38  6.6    9.2
## 5 87405500   0.2   1.4   2.55  3.28  4     14.2
## 6 87406900   0     1.1   1.9   2.59  3.15  16  
## 7 87409900   0     0.7   2.3   3.12  3.7   10.6
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  0.38 3.11    4.41  4.57  6.2   12.4
## 2 87398900  3.52 5.25    5.96  6.61  7.3   13.8
## 3 87398950  1.62 3.68    4.92  5.28  6.64  11.9
## 4 87398980  3.37 5.5     6.17  6.48  7.14  13.1
## 5 87405500  0.2  1.3     2.53  2.83  3.66   9.8
## 6 87406900  0.1  0.865   2.4   2.43  3.05   9.1
## 7 87409900  0.1  0.92    2.03  2.43  3.5    8.1

Time for this code chunk to run: 0.400324821472168

9.0.2 Demanda Bioquímica de Oxigênio

(dbo <- ggplot(plan_wide_19902020,
               aes(x = CODIGO,
                   y = DBO))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=10,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=5,
            ymax=10,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3,
            ymax=5,
            alpha=1,
            fill="#70c18c")+ #classe 2
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   facet_wrap(~periodo)+
   labs(title = "Demanda Bioquímica de Oxigênio no período 1990-2020",
        x="Estação",
        y="mg/L")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(1,100),
                      trans = "log10")+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 60 rows containing non-finite values (stat_boxplot).
## Removed 60 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 22 rows containing missing values (position_quasirandom).
## Warning: Removed 30 rows containing missing values (position_quasirandom).
## Warning: Removed 8 rows containing missing values (position_quasirandom).

Demanda Bioquímica de Oxigênio no período 1990-2020Time for this code chunk to run: 1.67118501663208

Time for this code chunk to run: 0.847186088562012

Time for this code chunk to run: 0.807019948959351

Time for this code chunk to run: 0.529752969741821

Time for this code chunk to run: 0.630424022674561

Time for this code chunk to run: 0.963673830032349

Time for this code chunk to run: 0.612422943115234

grid.arrange(dbo_p1, dbo_p2, dbo_p3, ncol = 3)

Time for this code chunk to run: 1.64878606796265

(sum_dbo_p1 <- plan_wide_19902020 %>%
   select(CODIGO, DBO, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(DBO, 
           na.rm = TRUE),
     q1 = 
       quantile(DBO, 0.25, 
                na.rm = TRUE),
     median = 
       median(DBO, 
              na.rm = TRUE),
     mean = 
       mean(DBO, 
            na.rm= TRUE),
     q3 = 
       quantile(DBO, 0.75, 
                na.rm = TRUE),
     max = 
       max(DBO, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1      2  1.86   2      13
## 2 87398900     1     1      1  1.52   2       6
## 3 87398950     1     1      1  1.66   2       6
## 4 87398980     1     1      1  1.13   1       2
## 5 87405500     1     2      3  5.37   5      64
## 6 87406900     1     4      5  9     11      26
## 7 87409900     2     3      4  6.97   9.5    31
(sum_dbo_p2 <- plan_wide_19902020 %>%
    select(CODIGO, DBO, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(DBO, 
            na.rm = TRUE),
      q1 = 
        quantile(DBO, 0.25, 
                 na.rm = TRUE),
      median = 
        median(DBO, 
               na.rm = TRUE),
      mean = 
        mean(DBO, 
             na.rm= TRUE),
      q3 = 
        quantile(DBO, 0.75, 
                 na.rm = TRUE),
      max = 
        max(DBO, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1      1  1.58   2       5
## 2 87398900     1     1      1  1.40   2       5
## 3 87398950     1     1      1  1.66   2       5
## 4 87398980     1     1      1  1.30   1       5
## 5 87405500     1     2      4  4.67   6.5    14
## 6 87406900     1     3      5  6.53   8      28
## 7 87409900     1     3      6  6.31   9      15
(sum_dbo_p3 <- plan_wide_19902020 %>%
    select(CODIGO, DBO, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(DBO, 
            na.rm = TRUE),
      q1 = 
        quantile(DBO, 0.25, 
                 na.rm = TRUE),
      median = 
        median(DBO, 
               na.rm = TRUE),
      mean = 
        mean(DBO, 
             na.rm= TRUE),
      q3 = 
        quantile(DBO, 0.75, 
                 na.rm = TRUE),
      max = 
        max(DBO, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1    1.5  2.15  3        7
## 2 87398900     1     1    1    1.51  2        5
## 3 87398950     1     1    2    2.65  2       18
## 4 87398980     1     1    1    1.32  2        2
## 5 87405500     1     3    4    5.28  6.25    21
## 6 87406900     1     3    5    6.58 10       24
## 7 87409900     1     3    4.5  6.18  8       18

Time for this code chunk to run: 0.185615062713623

ggsave("dbo.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = dbo,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("dbo_p1.png",
       plot = dbo_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("dbo_p2.png",
       plot = dbo_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("dbo_p3.png",
       plot = dbo_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("dbo_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(dbo_p1, dbo_p2, dbo_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 5.97567105293274

9.0.3 Fósforo total

(ptot <- ggplot(plan_wide_19902020,
                aes(CODIGO,
                    fosforo_total))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.15,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.1,
            ymax=0.15,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=0.1,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
  facet_wrap(~periodo)+
    labs(title = "Fósforo total no período 1990-2020",
         x="Estação",
         y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                 max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " ")
                      )+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 134 rows containing non-finite values (stat_boxplot).
## Removed 134 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 47 rows containing missing values (position_quasirandom).
## Warning: Removed 31 rows containing missing values (position_quasirandom).
## Warning: Removed 56 rows containing missing values (position_quasirandom).

Fósforo total no período 1990-2020Time for this code chunk to run: 1.27184295654297

(ptot_p1<-ggplot(plan_wide_19902020%>% 
                   filter(ANO_COLETA>"1990" &
                             ANO_COLETA<="2000"),
                 aes(CODIGO,
                     fosforo_total))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.15,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.1,
             ymax=0.15,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=0.1,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Fósforo total no período 1990-2000",
         x="Estação",
         y="mg/L")+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                       n.breaks = 8,
                       limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                  max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                       trans = "log10")+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.594965934753418

(ptot_p2 <- ggplot(plan_wide_19902020%>% 
                      filter(ANO_COLETA>"2000" &
                                ANO_COLETA<="2010"),
                   aes(CODIGO,
                       fosforo_total))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.15,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.1,
             ymax=0.15,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=0.1,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Fósforo total no período 2000-2010",
         x="Estação",
         y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                 max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                      trans = "log10")+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.58923602104187

(ptot_p3 <- ggplot(plan_wide_19902020%>% 
                      filter(ANO_COLETA>"2010" &
                                ANO_COLETA<="2020"),
                   aes(CODIGO,
                       fosforo_total))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.15,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.1,
             ymax=0.15,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=0.1,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Fósforo total no período 2010-2020",
         x="Estação",
         y="mg/L")+
    scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                       n.breaks = 8,
                       limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                  max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                       trans = "log10")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.523730039596558

grid.arrange(ptot_p1, ptot_p2, ptot_p3, ncol = 3)

Time for this code chunk to run: 1.54640221595764

(sum_ptot_p1 <- plan_wide_19902020 %>%
    select(CODIGO, fosforo_total, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(fosforo_total, na.rm = TRUE),
     q1 = 
       quantile(fosforo_total, 0.25, na.rm = TRUE),
     median = 
       median(fosforo_total, na.rm = TRUE),
     mean = 
       mean(fosforo_total, na.rm= TRUE),
     q3 = 
       quantile(fosforo_total, 0.75, na.rm = TRUE),
     max = 
       max(fosforo_total, na.rm = TRUE)))
## # A tibble: 7 x 7
##   CODIGO      min     q1 median   mean     q3   max
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
## 1 87398500 0.0097 0.0593 0.0881 0.123  0.14   0.863
## 2 87398900 0.0023 0.0468 0.0678 0.0747 0.0883 0.247
## 3 87398950 0.0202 0.0544 0.0737 0.0751 0.0904 0.179
## 4 87398980 0.01   0.0254 0.0547 0.0708 0.114  0.189
## 5 87405500 0.017  0.171  0.281  0.417  0.492  2.32 
## 6 87406900 0.156  0.270  0.508  0.785  1.07   2.79 
## 7 87409900 0.107  0.258  0.384  0.489  0.712  1.53
(sum_ptot_p2 <- plan_wide_19902020 %>%
    select(CODIGO, fosforo_total, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(fosforo_total, na.rm = TRUE),
      q1 = 
        quantile(fosforo_total, 0.25, na.rm = TRUE),
      median = 
        median(fosforo_total, na.rm = TRUE),
      mean = 
        mean(fosforo_total, na.rm= TRUE),
      q3 = 
        quantile(fosforo_total, 0.75, na.rm = TRUE),
      max = 
        max(fosforo_total, na.rm = TRUE)))
## # A tibble: 7 x 7
##   CODIGO      min     q1 median  mean    q3   max
##   <chr>     <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.025  0.094   0.131 0.148 0.16  0.637
## 2 87398900 0.015  0.0764  0.104 0.140 0.164 0.646
## 3 87398950 0.036  0.116   0.171 0.180 0.207 0.485
## 4 87398980 0.0115 0.052   0.076 0.101 0.103 1    
## 5 87405500 0.046  0.261   0.406 0.547 0.681 1.98 
## 6 87406900 0.056  0.338   0.599 0.752 0.967 3.49 
## 7 87409900 0.043  0.325   0.624 0.677 0.989 1.57
(sum_ptot_p3 <- plan_wide_19902020 %>%
    select(CODIGO, fosforo_total, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(fosforo_total, na.rm = TRUE),
      q1 = 
        quantile(fosforo_total, 0.25, na.rm = TRUE),
      median = 
        median(fosforo_total, na.rm = TRUE),
      mean = 
        mean(fosforo_total, na.rm= TRUE),
      q3 = 
        quantile(fosforo_total, 0.75, na.rm = TRUE),
      max = 
        max(fosforo_total, na.rm = TRUE)))
## # A tibble: 7 x 7
##   CODIGO     min     q1 median  mean    q3   max
##   <chr>    <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.061 0.118   0.163 0.166 0.186 0.381
## 2 87398900 0.057 0.0935  0.130 0.163 0.168 0.444
## 3 87398950 0.07  0.132   0.156 0.292 0.221 3.11 
## 4 87398980 0.019 0.0625  0.106 0.144 0.170 0.59 
## 5 87405500 0.013 0.187   0.332 0.361 0.45  0.803
## 6 87406900 0.089 0.254   0.364 0.448 0.560 1.26 
## 7 87409900 0.203 0.259   0.369 0.488 0.564 1.7

Time for this code chunk to run: 0.170565128326416

ggsave("ptot.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = ptot,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ptot_p1.png",
       plot = ptot_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ptot_p2.png",
       plot = ptot_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ptot_p3.png",
       plot = ptot_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ptot_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(ptot_p1, ptot_p2, ptot_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 5.73480606079102

9.0.4 Escherichia coli

ecoli__class <- function() {
  list(annotate("rect",
                xmin=-Inf,
                xmax=Inf,
                ymin=3200,
                ymax=Inf,
                alpha=1,
                fill="#ac5079")+ #>pior classe
         annotate("rect",
                  xmin=-Inf,
                  xmax=Inf,
                  ymin=800,
                  ymax=3200,
                  alpha=1,
                  fill="#fcf7ab")+ #classe 3
         annotate("rect",
                  xmin=-Inf,
                  xmax=Inf,
                  ymin=160,
                  ymax=800,
                  alpha=1,
                  fill="#70c18c")+ #classe 2
         annotate("rect",
                  xmin=-Inf,
                  xmax=Inf,
                  ymin=0,
                  ymax=160,
                  alpha=1,
                  fill="#8dcdeb") #classe 1
  )
}
  
(ecoli <- ggplot(plan_wide_19902020,
                 aes(CODIGO,
                     E_coli))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3200,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=800,
            ymax=3200,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=160,
            ymax=800,
            alpha=1,
            fill="#70c18c")+ #classe 2
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=160,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   facet_wrap(~periodo)+
   labs(title = "Escherichia coli no período 1990-2020",
        x="Estação",
        y="NMP/100mL")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      # n.breaks = 9,
                      n.breaks = 6,
                      limits = c(min(plan_wide_19902020$E_coli, na.rm = TRUE),
                                 max(plan_wide_19902020$E_coli, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()+
    theme(
        axis.text.y = element_text(
          angle = 90, 
          # size=15,
          # face=2
        )
    )
)

Escherichia-coli-gravataí no período 1990-2020Time for this code chunk to run: 1.43502688407898

(ecoli_p1 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"1990" &
                                 ANO_COLETA<="2000"),
                    aes(CODIGO,
                        E_coli))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3200,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=800,
             ymax=3200,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=160,
             ymax=800,
             alpha=1,
             fill="#70c18c")+ #classe 2
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=160,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Escherichia coli no período 1990-2000",
         x="Estação",
         y="NMP/100mL")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$E_coli, na.rm = TRUE),
                                 max(plan_wide_19902020$E_coli, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.657492876052856

(ecoli_p2 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"2000" &
                                 ANO_COLETA<="2010"),
                    aes(CODIGO,
                        E_coli))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3200,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=800,
             ymax=3200,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=160,
             ymax=800,
             alpha=1,
             fill="#70c18c")+ #classe 2
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=160,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Escherichia coli no período 2000-2010",
         x="Estação",
         y="NMP/100mL")+
    scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                       n.breaks = 9,
                       limits = c(min(plan_wide_19902020$E_coli, na.rm = TRUE),
                                  max(plan_wide_19902020$E_coli, na.rm = TRUE)),
                       trans = "log10",
                       labels = scales::number_format(accuracy = 1,
                                                      decimal.mark = ",",
                                                      big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.681545972824097

(ecoli_p3 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"2010" &
                                 ANO_COLETA<="2020"),
                    aes(CODIGO,
                        E_coli))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3200,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=800,
             ymax=3200,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=160,
             ymax=800,
             alpha=1,
             fill="#70c18c")+ #classe 2
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=160,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Escherichia coli no período 2010-2020",
         x="Estação",
         y="NMP/100mL")+
    scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                       n.breaks = 9,
                       limits = c(min(plan_wide_19902020$E_coli, na.rm = TRUE),
                                  max(plan_wide_19902020$E_coli, na.rm = TRUE)),
                       trans = "log10",
                       labels = scales::number_format(accuracy = 1,
                                                      decimal.mark = ",",
                                                      big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.704638957977295

grid.arrange(ecoli_p1, ecoli_p2, ecoli_p3, ncol = 3)

Time for this code chunk to run: 1.6226909160614

(sum_ecoli_p1 <- plan_wide_19902020 %>%
    select(CODIGO, E_coli, ANO_COLETA) %>% 
    filter(ANO_COLETA>"1990" &
              ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(E_coli, 
           na.rm = TRUE),
     q1 = 
       quantile(E_coli, 0.25, 
                na.rm = TRUE),
     median = 
       median(E_coli, 
              na.rm = TRUE),
     mean = 
       mean(E_coli, 
            na.rm= TRUE),
     q3 = 
       quantile(E_coli, 0.75, 
                na.rm = TRUE),
     max = 
       max(E_coli, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median   mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
## 1 87398500  32   136     240   854.    720 19200
## 2 87398900  16    68     160   548.    480  7760
## 3 87398950   2.4  12.8   268  4039.  10000 28000
## 4 87398980   4   160     243. 2907.    446 25600
## 5 87405500   1.6  12.8    24   545.    128 18400
## 6 87406900  13.6  61.6   192   718.    414 12800
## 7 87409900   2.4  12.8    64    97.7   128   720
(sum_ecoli_p2 <- plan_wide_19902020 %>%
    select(CODIGO, E_coli, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(E_coli, 
            na.rm = TRUE),
      q1 = 
        quantile(E_coli, 0.25, 
                 na.rm = TRUE),
      median = 
        median(E_coli, 
               na.rm = TRUE),
      mean = 
        mean(E_coli, 
             na.rm= TRUE),
      q3 = 
        quantile(E_coli, 0.75, 
                 na.rm = TRUE),
      max = 
        max(E_coli, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median   mean     q3    max
##   <chr>    <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 87398500  21.6   91    150   1335.   308   27200
## 2 87398900  11     70    133.   444.   414.   2600
## 3 87398950  20    400    720    935.  1120    5500
## 4 87398980  24    110.   195    410.   289.   8800
## 5 87405500   4.7  162   2400  25445. 12950  490000
## 6 87406900   8    172  12800  66370. 62300  650000
## 7 87409900  16   7355. 35500  72440. 68750  460000
(sum_ecoli_p3 <- plan_wide_19902020 %>%
    select(CODIGO, E_coli, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(E_coli, 
            na.rm = TRUE),
      q1 = 
        quantile(E_coli, 0.25, 
                 na.rm = TRUE),
      median = 
        median(E_coli, 
               na.rm = TRUE),
      mean = 
        mean(E_coli, 
             na.rm= TRUE),
      q3 = 
        quantile(E_coli, 0.75, 
                 na.rm = TRUE),
      max = 
        max(E_coli, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO      min      q1 median    mean      q3      max
##   <chr>     <dbl>   <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
## 1 87398500   90     155.    260     409.    451     2420 
## 2 87398900   10      52.8   107     245.    313     1553.
## 3 87398950  108.    250     487    1424.   1553.   10462 
## 4 87398980   40.8   140.    242.    529.    738.    2400 
## 5 87405500  632    8965   19232. 109992.  70750  1400000 
## 6 87406900 1440   23100   34500  230828. 140500  3400000 
## 7 87409900 2000   20100   38400   83128.  83680   345000

Time for this code chunk to run: 0.216716051101685

ggsave("ecoli.png",
       plot = ecoli,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ecoli_p1.png",
       plot = ecoli_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ecoli_p2.png",
       plot = ecoli_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ecoli_p3.png",
       plot = ecoli_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ecoli_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(ecoli_p1, ecoli_p2, ecoli_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 7.73045206069946

9.0.5 Nitrogênio amoniacal

(namon <- ggplot(plan_wide_19902020,
                 aes(CODIGO,
                     nitro_amon))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   facet_wrap(~periodo)+
   labs(title = "Nitrogênio amoniacal no período 1990-2020",
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitro_total, na.rm = TRUE),
                                 max(plan_wide_19902020$nitro_total, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

nitrogenio-gravataí no período 1990-2020Time for this code chunk to run: 1.94210195541382

periodo_inicial <- as.Date("1990-01-01", "%Y-%m-%d")
periodo_final <- as.Date("2021-01-01",  "%Y-%m-%d")

(nitro_line <- 
    
    plan_wide_19902020 %>%
    filter(ANO_COLETA > "1990" &
             ANO_COLETA <= "2020") %>%
    dplyr::select(CODIGO, nitro_amon, DATA_COLETA, periodo) %>%
    group_by(CODIGO) %>%
    # pivot_wider(
    #   names_from = CODIGO,
    #   values_from = nitro_amon,
    #   id_cols = DATA_COLETA
    # ) %>% 
    ggplot(
      aes(x = DATA_COLETA,
          y = nitro_amon,
          # color = CODIGO
      ))+
    # geom_rect(
    #   aes(xmin = periodo_inicial, 
    #       xmax = periodo_final,
    #       ymin = 13.3, 
    #       ymax = Inf,
    #       alpha= 0.005,
    #       fill= "#ac5079"),
    # show.legend = FALSE)+ #>pior classe
    # geom_rect(
    #   aes(xmin = periodo_inicial, 
    #       xmax = periodo_final,
  #       ymin= 3.7,
  #       ymax= 13.3,
  #       alpha= 0.005,
  #       fill= "#fcf7ab"),
  #    show.legend = FALSE)+ #classe 3
  # geom_rect(
  #   aes(xmin = periodo_inicial, 
  #       xmax = periodo_final,
  #       ymin= 0,
  #       ymax= 3.7,
  #       alpha= 0.005,
  #       fill= "blue"
  #         # "#8dcdeb"
  #         ),
  #    show.legend = FALSE)+ #classe 1
  annotate("rect",
           xmin= periodo_inicial,
           xmax= periodo_final,
           ymin=13.3,
           ymax=Inf,
           alpha= 0.7,
           fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin= periodo_inicial,
             xmax= periodo_final,
             ymin=3.7,
             ymax=13.3,
             alpha= 0.7,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin= periodo_inicial,
             xmax= periodo_final,
             ymin= -Inf,
             ymax=3.7,
             alpha= 0.7,
             fill="#8dcdeb")+ #classe 1
    geom_line(
      # aes(color = CODIGO),
      na.rm = TRUE)+
    geom_point(
      # aes(color = CODIGO),
      na.rm = TRUE)+
    scale_x_date(
      limits = as.Date(c(
        "1990-01-01", 
        "2021-01-01"
        # NA #pode usar NA também
      )),
      expand = c(0.0, 0.0),
      date_breaks = "10 years",
      minor_breaks = "5 years",
      date_labels = "%Y",
    )+
    # geom_smooth(
    #   # aes(color = CODIGO),
    #   method = "lm",
    #   # formula = y ~ poly(x, 2),
    #   # span = 0.2,
    #   se = TRUE, #se deixar TRUE gera o intervalo de confiança de 95%
    #   aes(group = 1),
    #   alpha =.5,
    #   na.rm = TRUE,
    #   size = 0.3,
    #   # fullrange = TRUE,
  #   # show.legend = TRUE
  # )+
  # stat_smooth(
  #   geom = "smooth",
  #   # span = 0.2,
  #   se = FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
  #   # aes(group = 1),
  #   # alpha =.5,
  #   na.rm = TRUE,
  #   # size = 0.3,
  #   fullrange = TRUE,
  #   show.legend = TRUE
  # )+
  facet_wrap(
    ~CODIGO,
    nrow = 4,
  )+
    theme_bw()
)

Time for this code chunk to run: 1.62203097343445

(namon_p1 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"1990" &
                               ANO_COLETA<="2000"),
                    aes(CODIGO,
                        nitro_total))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3.7,
             ymax=13.3,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=3.7,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 1990-2000",
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitro_total, na.rm = TRUE),
                                 max(plan_wide_19902020$nitro_total, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 1.22956299781799

(namon_p2 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"2000" &
                               ANO_COLETA<="2010"),
                    aes(CODIGO,
                        nitro_total))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 2000-2010",
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitro_total, na.rm = TRUE),
                                 max(plan_wide_19902020$nitro_total, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.803087949752808

(namon_p3 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"2010" &
                                 ANO_COLETA<="2020"),
                    aes(CODIGO,
                        nitro_total))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 2010-2020",
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitro_total, na.rm = TRUE),
                                 max(plan_wide_19902020$nitro_total, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.718377828598022

grid.arrange(namon_p1, namon_p2, namon_p3, ncol = 3)

Time for this code chunk to run: 1.91668200492859

(sum_namon_p1 <- plan_wide_19902020 %>%
   select(CODIGO, nitro_total, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(nitro_total, 
           na.rm = TRUE),
     q1 = 
       quantile(nitro_total, 0.25, 
                na.rm = TRUE),
     median = 
       median(nitro_total, 
              na.rm = TRUE),
     mean = 
       mean(nitro_total, 
            na.rm= TRUE),
     q3 = 
       quantile(nitro_total, 0.75, 
                na.rm = TRUE),
     max = 
       max(nitro_total, 
           na.rm = TRUE),
      n = 
       length(nitro_total)
   )
)
## # A tibble: 7 x 8
##   CODIGO     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500 0.44  0.842  1.00  1.22   1.34  3.81   101
## 2 87398900 0.22  0.82   1     1.09   1.25  4.86   101
## 3 87398950 0.51  0.83   1.02  1.06   1.19  2.16    68
## 4 87398980 0.549 0.68   0.755 0.872  1.01  1.85    30
## 5 87405500 0.51  1.53   2.94  5.27   6.77 21.6     97
## 6 87406900 1.34  2.60   4.56  7.58  11.2  29.1     32
## 7 87409900 0.5   1.98   4.29  5.18   7.01 19.6     65
(sum_namon_p2 <- plan_wide_19902020 %>%
    select(CODIGO, nitro_total, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(nitro_total, 
            na.rm = TRUE),
      q1 = 
        quantile(nitro_total, 0.25, 
                 na.rm = TRUE),
      median = 
        median(nitro_total, 
               na.rm = TRUE),
      mean = 
        mean(nitro_total, 
             na.rm= TRUE),
      q3 = 
        quantile(nitro_total, 0.75, 
                 na.rm = TRUE),
      max = 
        max(nitro_total, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.18  0.885  0.992  1.80  1.46 23.2 
## 2 87398900 0.48  0.894  1.13   1.38  1.57  7.92
## 3 87398950 0.57  1.26   1.45   1.43  1.71  1.98
## 4 87398980 0.19  0.685  0.79   1.05  1.10  5.2 
## 5 87405500 0.968 2      3.29   5.45  6.60 21.7 
## 6 87406900 0.77  2.4    4.54   7.30 10.2  39.1 
## 7 87409900 1.62  2.5    6.97   7.92 10.6  21.5
(sum_namon_p3 <- plan_wide_19902020 %>%
    select(CODIGO, nitro_total, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(nitro_total, 
            na.rm = TRUE),
      q1 = 
        quantile(nitro_total, 0.25, 
                 na.rm = TRUE),
      median = 
        median(nitro_total, 
               na.rm = TRUE),
      mean = 
        mean(nitro_total, 
             na.rm= TRUE),
      q3 = 
        quantile(nitro_total, 0.75, 
                 na.rm = TRUE),
      max = 
        max(nitro_total, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.222 0.89    1.11  1.24  1.41  2.56
## 2 87398900 0.095 0.883   1.02  1.29  1.40  4.25
## 3 87398950 0.612 1.04    1.43  1.90  2.06  9.5 
## 4 87398980 0.216 0.973   1.12  1.22  1.58  2.32
## 5 87405500 1.12  2.03    3.14  4.50  5.93 22.0 
## 6 87406900 1.37  2.40    5.58  6.47  7.58 25   
## 7 87409900 1.11  3       6.15  7.29  7.75 36

Time for this code chunk to run: 0.173871040344238

ggsave("namon.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = namon,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_p1.png",
       plot = namon_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_p2.png",
       plot = namon_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_p3.png",
       plot = namon_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(namon_p1, namon_p2, namon_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 5.34220194816589

9.0.6 Turbidez

(turb <- ggplot(plan_wide_19902020,
                   aes(CODIGO,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   facet_wrap(~periodo)+
   labs(title = "Turbidez no período 1990-2020",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.05)),
                      n.breaks = 8,
                      limits = c(
                        # 1,
                        min(plan_wide_19902020$turbidez, na.rm = TRUE),
                        # 500
                        max(plan_wide_19902020$turbidez, na.rm = TRUE)
                      ),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

turbidez-gravataí no período 1990-2020Time for this code chunk to run: 1.30961680412292

(turb_line <- plan_wide_19902020 %>%
  filter(ANO_COLETA > "1990" &
           ANO_COLETA <= "2020") %>%
  select(CODIGO, turbidez, DATA_COLETA, periodo) %>%
  group_by(CODIGO) %>%
  ggplot(
    aes(x = DATA_COLETA,
        y = turbidez,
        color = CODIGO
    ))+
    geom_line(
      # aes(color = CODIGO),
      na.rm = TRUE)+
    geom_point(
      # aes(color = CODIGO),
      na.rm = TRUE)+
    scale_x_date(
      limits = as.Date(c(
        "1990-01-01", 
        "2021-01-01"
        # NA #pode usar NA também
      )),
      expand = c(0.0, 0.0),
      date_breaks = "10 years",
      minor_breaks = "5 years",
      date_labels = "%Y",
    )+
  # geom_smooth(
  #   # aes(color = CODIGO),
  #   method = "lm",
  #   # formula = y ~ poly(x, 2),
  #   # span = 0.2,
  #   se = TRUE, #se deixar TRUE gera o intervalo de confiança de 95%
  #   aes(group = 1),
  #   alpha =.5,
  #   na.rm = TRUE,
  #   size = 0.3,
  #   # fullrange = TRUE,
  #   # show.legend = TRUE
  # )+
  # stat_smooth(
  #   geom = "smooth",
  #   # span = 0.2,
  #   se = FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
  #   # aes(group = 1),
  #   # alpha =.5,
  #   na.rm = TRUE,
  #   # size = 0.3,
  #   fullrange = TRUE,
  #   show.legend = TRUE
  # )+
  facet_wrap(
    ~CODIGO,
    nrow = 4,
  )+
  theme_bw()
)

Time for this code chunk to run: 1.19224500656128

(turb_p1 <- ggplot(plan_wide_19902020 %>% 
                     filter(ANO_COLETA>"1990" &
                              ANO_COLETA<="2000"),
                   aes(CODIGO,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 1990-2000",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.558158159255981

(turb_p2 <- ggplot(plan_wide_19902020 %>% 
                     filter(ANO_COLETA>"2000" &
                              ANO_COLETA<="2010"),
                   aes(CODIGO,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 2000-2010",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.518996953964233

(turb_p3 <- ggplot(plan_wide_19902020 %>% 
                     filter(ANO_COLETA>"2010" &
                              ANO_COLETA<="2020"),
                   aes(CODIGO,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 2010-2020",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.614032030105591

grid.arrange(turb_p1, turb_p2, turb_p3, ncol = 3)

Time for this code chunk to run: 1.60389304161072

(sum_turb_p1 <- plan_wide_19902020 %>%
   select(CODIGO, turbidez, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(turbidez, 
           na.rm = TRUE),
     q1 = 
       quantile(turbidez, 0.25, 
                na.rm = TRUE),
     median = 
       median(turbidez, 
              na.rm = TRUE),
     mean = 
       mean(turbidez, 
            na.rm= TRUE),
     q3 = 
       quantile(turbidez, 0.75, 
                na.rm = TRUE),
     max = 
       max(turbidez, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   6.2  19     34.5  63.5  67     461
## 2 87398900   9    19     49.5  61.5  73.8   460
## 3 87398950   9.6  16     22    33.3  48.8   144
## 4 87398980  16    32.8   43    66.8  90.5   190
## 5 87405500   8.5  23.5   47    47.5  58     159
## 6 87406900  33    54.8   67    77.7  81.5   199
## 7 87409900   5.8  15     25    32.2  48      76
(sum_turb_p2 <- plan_wide_19902020 %>%
    select(CODIGO, turbidez, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(turbidez, 
            na.rm = TRUE),
      q1 = 
        quantile(turbidez, 0.25, 
                 na.rm = TRUE),
      median = 
        median(turbidez, 
               na.rm = TRUE),
      mean = 
        mean(turbidez, 
             na.rm= TRUE),
      q3 = 
        quantile(turbidez, 0.75, 
                 na.rm = TRUE),
      max = 
        max(turbidez, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     9  41.2   55.5  71.1  74.2   428
## 2 87398900    39  57     78   107.  116.    475
## 3 87398950    39  47     64    96.5  90     330
## 4 87398980    24  37     50    64.5  87     176
## 5 87405500    32  46     63.5  70.3  76     341
## 6 87406900    35  49     62    69.9  75.5   284
## 7 87409900    40  45     60    70.4  90     151
(sum_turb_p3 <- plan_wide_19902020 %>%
    select(CODIGO, turbidez, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(turbidez, 
            na.rm = TRUE),
      q1 = 
        quantile(turbidez, 0.25, 
                 na.rm = TRUE),
      median = 
        median(turbidez, 
               na.rm = TRUE),
      mean = 
        mean(turbidez, 
             na.rm= TRUE),
      q3 = 
        quantile(turbidez, 0.75, 
                 na.rm = TRUE),
      max = 
        max(turbidez, 
            na.rm = TRUE))
) 
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  8.52  16.4   29    33.3  43     85 
## 2 87398900 14.8   39.2   48.3  66.7  73.4  299 
## 3 87398950 16     29.9   41    51.6  65    230 
## 4 87398980 11     19.4   33.6  39.5  42.2  110.
## 5 87405500 10.0   29.0   41    42.9  54.5  131 
## 6 87406900  9.62  23     39    41.2  52    122 
## 7 87409900  9.68  22.0   34.0  40.5  47    182.

Time for this code chunk to run: 0.262860059738159

ggsave("turb.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = turb,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_p1.png",
       plot = turb_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_p2.png",
       plot = turb_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_p3.png",
       plot = turb_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(turb_p1, turb_p2, turb_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 5.48286008834839

9.0.7 pH

(pH <- ggplot(plan_wide_19902020,
                 aes(CODIGO,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   facet_wrap(~periodo)+
   labs(title = "pH no período 1990-2020",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

pH-gravataí no período 1990-2020Time for this code chunk to run: 1.42400908470154

(pH_p1 <- ggplot(plan_wide_19902020 %>% 
                   filter(ANO_COLETA>"1990" &
                            ANO_COLETA<="2000"),
                 aes(CODIGO,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 1990-2000",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.584261178970337

(pH_p2 <- ggplot(plan_wide_19902020 %>% 
                   filter(ANO_COLETA>"2000" &
                            ANO_COLETA<="2010"),
                 aes(CODIGO,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 2000-2010",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.5538330078125

(pH_p3 <- ggplot(plan_wide_19902020 %>% 
                   filter(ANO_COLETA>"2010" &
                            ANO_COLETA<="2020"),
                 aes(CODIGO,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 2010-2020",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.50394082069397

grid.arrange(pH_p1, pH_p2, pH_p3, ncol = 3)

Time for this code chunk to run: 1.69596910476685

(sum_pH_p1 <- plan_wide_19902020 %>%
   select(CODIGO, pH, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(pH, 
           na.rm = TRUE),
     q1 = 
       quantile(pH, 0.25, 
                na.rm = TRUE),
     median = 
       median(pH, 
              na.rm = TRUE),
     mean = 
       mean(pH, 
            na.rm= TRUE),
     q3 = 
       quantile(pH, 0.75, 
                na.rm = TRUE),
     max = 
       max(pH, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   5    6.18   6.59  6.51  6.82   7.9
## 2 87398900   5.2  6      6.3   6.33  6.63   7.9
## 3 87398950   5.4  6.29   6.4   6.49  6.72   8.1
## 4 87398980   5.3  5.93   6.2   6.16  6.3    7.3
## 5 87405500   5    6.3    6.4   6.47  6.7    9.3
## 6 87406900   5.5  6.18   6.45  6.43  6.8    7.3
## 7 87409900   4.5  6.2    6.4   6.44  6.7    7.4
(sum_pH_p2 <- plan_wide_19902020 %>%
    select(CODIGO, pH, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(pH, 
            na.rm = TRUE),
      q1 = 
        quantile(pH, 0.25, 
                 na.rm = TRUE),
      median = 
        median(pH, 
               na.rm = TRUE),
      mean = 
        mean(pH, 
             na.rm= TRUE),
      q3 = 
        quantile(pH, 0.75, 
                 na.rm = TRUE),
      max = 
        max(pH, 
            na.rm = TRUE))
) 
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   5.3   6.3   6.6   6.59  6.88   7.9
## 2 87398900   5.5   6.4   6.65  6.63  6.9    7.5
## 3 87398950   6     6.6   6.8   6.89  7.25   7.6
## 4 87398980   5.8   6.3   6.5   6.63  7      7.5
## 5 87405500   5.2   6.4   6.6   6.68  6.9    8.3
## 6 87406900   5.5   6.4   6.7   6.66  6.9    8.6
## 7 87409900   5.8   6.5   6.8   6.77  7      8.4
(sum_pH_p3 <- plan_wide_19902020 %>%
    select(CODIGO, pH, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(pH, 
            na.rm = TRUE),
      q1 = 
        quantile(pH, 0.25, 
                 na.rm = TRUE),
      median = 
        median(pH, 
               na.rm = TRUE),
      mean = 
        mean(pH, 
             na.rm= TRUE),
      q3 = 
        quantile(pH, 0.75, 
                 na.rm = TRUE),
      max = 
        max(pH, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  5.47  6.28   6.42  6.47  6.60  7.3 
## 2 87398900  5.68  6.36   6.5   6.57  6.84  7.4 
## 3 87398950  5.71  6.28   6.46  6.46  6.68  7   
## 4 87398980  5.42  6.10   6.36  6.39  6.6   7.2 
## 5 87405500  5.64  6.34   6.5   6.49  6.7   7.01
## 6 87406900  5.6   6.4    6.48  6.51  6.77  7.3 
## 7 87409900  5.59  6.46   6.6   6.57  6.76  7.2

Time for this code chunk to run: 0.174906015396118

ggsave("pH.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = pH,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_p1.png",
       plot = pH_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_p2.png",
       plot = pH_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_p3.png",
       plot = pH_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(pH_p1, pH_p2, pH_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 5.58305883407593

9.0.8 Sólidos totais

(SolTot <- ggplot(plan_wide_19902020,
                  aes(CODIGO,
                      solidos_totais))+
   annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   facet_wrap(~periodo)+
   labs(title = "Sólidos totais no período 1990-2020",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

sólidos-totais-gravataí no período 1990-2020Time for this code chunk to run: 1.44340991973877

(SolTot_p1 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"1990" &
                                ANO_COLETA<="2000"),
                     aes(CODIGO,
                         solidos_totais))+
   annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Sólidos totais no período 1990-2000",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.635100126266479

(SolTot_p2 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"2000" &
                                ANO_COLETA<="2010"),
                     aes(CODIGO,
                         solidos_totais))+
   annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Sólidos totais no período 2000-2010",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.62639307975769

(SolTot_p3 <- ggplot(plan_wide_19902020 %>% 
                        filter(ANO_COLETA>"2010" &
                                  ANO_COLETA<="2020"),
                     aes(CODIGO,
                         solidos_totais))+
    annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=-Inf,
             ymax=500,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Sólidos totais no período 2010-2020",
         x="Estação",
         y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.661776065826416

grid.arrange(SolTot_p1, SolTot_p2, SolTot_p3, ncol = 3)

Time for this code chunk to run: 1.5915949344635

(sum_SolTot_p1 <- plan_wide_19902020 %>%
   select(CODIGO, solidos_totais, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(solidos_totais, 
           na.rm = TRUE),
     q1 = 
       quantile(solidos_totais, 0.25, 
                na.rm = TRUE),
     median = 
       median(solidos_totais, 
              na.rm = TRUE),
     mean = 
       mean(solidos_totais, 
            na.rm= TRUE),
     q3 = 
       quantile(solidos_totais, 0.75, 
                na.rm = TRUE),
     max = 
       max(solidos_totais, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    46  84.5   95   122.   120    510
## 2 87398900    18  74.5   97   111.   122.   474
## 3 87398950    10  76.5   91    90.9  106.   155
## 4 87398980    48  63.5   81.5 104.   126.   337
## 5 87405500    70 101    121   133.   151    361
## 6 87406900    89 118    155   165.   210    279
## 7 87409900    20  99.5  122   128.   143    381
(sum_SolTot_p2 <- plan_wide_19902020 %>%
    select(CODIGO, solidos_totais, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(solidos_totais, 
            na.rm = TRUE),
      q1 = 
        quantile(solidos_totais, 0.25, 
                 na.rm = TRUE),
      median = 
        median(solidos_totais, 
               na.rm = TRUE),
      mean = 
        mean(solidos_totais, 
             na.rm= TRUE),
      q3 = 
        quantile(solidos_totais, 0.75, 
                 na.rm = TRUE),
      max = 
        max(solidos_totais, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    28  80     100  111.   123.   412
## 2 87398900    42  82     102. 128.   140.   489
## 3 87398950    46  94.2   108. 126.   127.   318
## 4 87398980    40  61      77   85.3   96    228
## 5 87405500    48 102     133  148.   170.   522
## 6 87406900    50 109     134. 154.   170.   670
## 7 87409900    56 112.    156  167.   190.   599
(sum_SolTot_p3 <- plan_wide_19902020 %>%
    select(CODIGO, solidos_totais, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(solidos_totais, 
            na.rm = TRUE),
      q1 = 
        quantile(solidos_totais, 0.25, 
                 na.rm = TRUE),
      median = 
        median(solidos_totais, 
               na.rm = TRUE),
      mean = 
        mean(solidos_totais, 
             na.rm= TRUE),
      q3 = 
        quantile(solidos_totais, 0.75, 
                 na.rm = TRUE),
      max = 
        max(solidos_totais, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    61  69      90   82.8   96    101
## 2 87398900    41  77     104  120.   127    308
## 3 87398950    45  93     101  109.   117    221
## 4 87398980    55  62.8    80   79.9   95    109
## 5 87405500    83  89.2   108. 124.   162.   195
## 6 87406900    50 106     117  135.   163    246
## 7 87409900    75 103     115  131.   145    251

Time for this code chunk to run: 0.178591012954712

ggsave("SolTot.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = SolTot,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_p1.png",
       plot = SolTot_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_p2.png",
       plot = SolTot_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_p3.png",
       plot = SolTot_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(SolTot_p1, SolTot_p2, SolTot_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 5.43687987327576

9.0.9 IQA

iqa-gravataí no período 1990-2020Time for this code chunk to run: 1.10899305343628

Time for this code chunk to run: 0.514012098312378

Time for this code chunk to run: 0.518717050552368

Time for this code chunk to run: 0.585233926773071

grid.arrange(iqa_p1, iqa_p2, iqa_p3, ncol = 3)

Time for this code chunk to run: 1.41797399520874

(sum_IQA_p1 <- plan_wide_19902020 %>%
   select(CODIGO, IQA, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(IQA, 
           na.rm = TRUE),
     q1 = 
       quantile(IQA, 0.25, 
                na.rm = TRUE),
     median = 
       median(IQA, 
              na.rm = TRUE),
     mean = 
       mean(IQA, 
            na.rm= TRUE),
     q3 = 
       quantile(IQA, 0.75, 
                na.rm = TRUE),
     max = 
       max(IQA, 
           na.rm = TRUE),
     n = 
        length(IQA)
   )
)
## # A tibble: 7 x 8
##   CODIGO     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  27.0  35.7   40.9  40.7  46.2  52.2   101
## 2 87398900  27.8  37.9   42.9  43.0  48.0  58.5   101
## 3 87398950  32.8  36.8   41.4  43.2  48.6  61.9    68
## 4 87398980  29.2  35.8   40.4  40.3  44.8  51.9    30
## 5 87405500  24.8  34.9   41.2  40.3  46.9  57.6    97
## 6 87406900  24.7  31.3   37.8  37.4  44.4  49.0    32
## 7 87409900  23.6  31.9   37.1  38.8  46.2  55.4    65
(sum_IQA_p2 <- plan_wide_19902020 %>%
    select(CODIGO, IQA, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(IQA, 
            na.rm = TRUE),
      q1 = 
        quantile(IQA, 0.25, 
                 na.rm = TRUE),
      median = 
        median(IQA, 
               na.rm = TRUE),
      mean = 
        mean(IQA, 
             na.rm= TRUE),
      q3 = 
        quantile(IQA, 0.75, 
                 na.rm = TRUE),
      max = 
        max(IQA, 
            na.rm = TRUE),
      n = 
        length(IQA)
      )
)
## # A tibble: 7 x 8
##   CODIGO     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  27.8  34.6   40.0  39.5  43.5  48.7    75
## 2 87398900  28.5  35.1   37.6  38.3  40.6  48.5    77
## 3 87398950  21.1  29.4   32.7  32.8  36.8  44.0    30
## 4 87398980  24.5  35.7   39.4  39.5  43.4  52.1    66
## 5 87405500  19.8  28.7   31.5  31.9  35.7  48.8    78
## 6 87406900  17.1  25.3   29.0  29.5  32.8  44.1    79
## 7 87409900  16.2  20.5   26.1  25.0  29.8  33.1    31
(sum_IQA_p3 <- plan_wide_19902020 %>%
    select(CODIGO, IQA, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>%
    # ?as_factor(CODIGO) %>% 
    group_by(CODIGO) %>%
    summarize(
      min = 
        min(IQA, 
            na.rm = TRUE),
      q1 = 
        quantile(IQA, 0.25, 
                 na.rm = TRUE),
      median = 
        median(IQA, 
               na.rm = TRUE),
      mean = 
        mean(IQA, 
             na.rm= TRUE),
      q3 = 
        quantile(IQA, 0.75, 
                 na.rm = TRUE),
      max = 
        max(IQA, 
            na.rm = TRUE),
      n = 
        length(IQA),
      NAs = 
        sum(is.na(IQA))
      ) %>% 
  mutate(
    "%NA" = NAs/n*100
  )
)
## # A tibble: 7 x 10
##   CODIGO     min    q1 median  mean    q3   max     n   NAs `%NA`
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int> <int> <dbl>
## 1 87398500  40.2  42.5   45.4  44.2  45.5  47.2    34    29  85.3
## 2 87398900  34.1  38.6   41.2  40.2  42.9  44.4    36    32  88.9
## 3 87398950  36.7  39.5   42.4  41.5  44.4  44.6    35    31  88.6
## 4 87398980  40.0  40.0   40.0  40.0  40.0  40.0    28    27  96.4
## 5 87405500  30.8  31.6   32.5  32.5  33.3  34.1    33    31  93.9
## 6 87406900  22.9  24.4   25.9  25.3  26.5  27.2    35    32  91.4
## 7 87409900  24.1  25.1   27.3  26.9  28.2  29.7    37    32  86.5

Time for this code chunk to run: 0.192636013031006

ggsave("iqa.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = iqa,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_p1.png",
       plot = iqa_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_p2.png",
       plot = iqa_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_p3.png",
       plot = iqa_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(iqa_p1, iqa_p2, iqa_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 5.42067289352417

9.1 Testando coisas

9.1.1 Correlação

parametros_IQA %>% 
  dplyr::select(
    -CODIGO,
    -nitro_total) %>% 
  # group_by(CODIGO) %>% 
  rename(
    CE = Condutividade,
    OD = oxigenio_dissolvido,
    ST = solidos_totais,
    Turb = turbidez,
    Temp = temp_agua,
    Ptot = fosforo_total,
    NAmon = nitro_amon,
    NTK = nitro_kjeldahl
  ) %>% 
  ggcorr(
    method = "complete.obs",
    # "pearson",
    # "pairwise",
    name = "Correlação",
    label = TRUE,
    label_alpha = TRUE,
    digits = 3,
    low = "#3B9AB2",
    mid = "#EEEEEE",
    high = "#F21A00",
    # palette = "RdYlBu",
    layout.exp = 0,
    legend.position = "left",
    label_round = 3,
    # legend.size = 18,
    geom = "tile",
    nbreaks = 10,
  )+
  labs(title = "Correlação entre parâmetros físico-químicos na\nBacia Hidrográfica do rio Gravataí no período 1990-2020")+
  theme_linedraw()+
  theme(
    legend.position = c(0.15, 0.6),
    legend.title = element_text(size = 16),
    legend.text = element_text(size = 14),
    # legend.spacing = unit(element_text(),
                          # units = 5)
    plot.title = element_text(hjust = 0.5,
                              size = 16)
  )

correlação-parametros-qualidade-agua-gravataí no período 1990-2020

# Gráfico das correlações entre todos os parâmetros com significância
correl_IQA <- parametros_IQA %>%
  dplyr::select(-CODIGO) %>%
  ggpairs(title = "Correlação entre parâmetros que compõem o IQA",
          axisLabels = "show")

correlacao_pIQA <- parametros_IQA %>% 
  group_by(CODIGO) %>% 
  correlation::correlation()

correlacao_pIQA %>% 
  # glimpse()
  filter(
    p < 0.001
  ) %>% 
  t() %>% 
  summary()
##  87398500 - DBO   87398500 - nitro_kjeldahl 87398500 - nitro_total
##  Min.   :0.4176   Min.   :0.4105            Min.   :0.4915        
##  1st Qu.:1.0000   1st Qu.:0.7854            1st Qu.:1.0000        
##  Median :1.0000   Median :1.0000            Median :1.0000        
##  Mean   :0.9552   Mean   :0.8634            Mean   :0.9609        
##  3rd Qu.:1.0000   3rd Qu.:1.0000            3rd Qu.:1.0000        
##  Max.   :1.0000   Max.   :1.0000            Max.   :1.0000        
##  87398500 - fosforo_total 87398500 - temp_agua 87398500 - turbidez
##  Min.   :0.3641           Min.   :-0.4765      Min.   :0.3641     
##  1st Qu.:1.0000           1st Qu.: 1.0000      1st Qu.:1.0000     
##  Median :1.0000           Median : 1.0000      Median :1.0000     
##  Mean   :0.8668           Mean   : 0.8864      Mean   :0.9133     
##  3rd Qu.:1.0000           3rd Qu.: 1.0000      3rd Qu.:1.0000     
##  Max.   :1.0000           Max.   : 1.0000      Max.   :1.0000     
##  87398500 - oxigenio_dissolvido 87398500 - nitro_amon 87398500 - pH
##  Min.   :-0.4765                Min.   :1             Min.   :1    
##  1st Qu.: 1.0000                1st Qu.:1             1st Qu.:1    
##  Median : 1.0000                Median :1             Median :1    
##  Mean   : 0.7836                Mean   :1             Mean   :1    
##  3rd Qu.: 1.0000                3rd Qu.:1             3rd Qu.:1    
##  Max.   : 1.0000                Max.   :1             Max.   :1    
##  87398500 - solidos_totais 87398500 - E_coli 87398500 - ANO_COLETA
##  Min.   :0.4915            Min.   :1         Min.   :-0.3361      
##  1st Qu.:0.8978            1st Qu.:1         1st Qu.: 1.0000      
##  Median :1.0000            Median :1         Median : 1.0000      
##  Mean   :0.8976            Mean   :1         Mean   : 0.8972      
##  3rd Qu.:1.0000            3rd Qu.:1         3rd Qu.: 1.0000      
##  Max.   :1.0000            Max.   :1         Max.   : 1.0000      
##  87398500 - Condutividade 87398900 - DBO   87398900 - nitro_kjeldahl
##  Min.   :1                Min.   :0.3880   Min.   :0.4385           
##  1st Qu.:1                1st Qu.:1.0000   1st Qu.:0.9982           
##  Median :1                Median :1.0000   Median :1.0000           
##  Mean   :1                Mean   :0.9529   Mean   :0.9000           
##  3rd Qu.:1                3rd Qu.:1.0000   3rd Qu.:1.0000           
##  Max.   :1                Max.   :1.0000   Max.   :1.0000           
##  87398900 - nitro_total 87398900 - fosforo_total 87398900 - temp_agua
##  Min.   :0.4067         Min.   :0.3526           Min.   :-0.3893     
##  1st Qu.:0.9982         1st Qu.:0.5279           1st Qu.: 1.0000     
##  Median :1.0000         Median :1.0000           Median : 1.0000     
##  Mean   :0.8647         Mean   :0.8295           Mean   : 0.8931     
##  3rd Qu.:1.0000         3rd Qu.:1.0000           3rd Qu.: 1.0000     
##  Max.   :1.0000         Max.   :1.0000           Max.   : 1.0000     
##  87398900 - turbidez 87398900 - oxigenio_dissolvido 87398900 - nitro_amon
##  Min.   :0.4067      Min.   :-0.3893                Min.   :0.3880       
##  1st Qu.:0.9070      1st Qu.: 1.0000                1st Qu.:0.7489       
##  Median :1.0000      Median : 1.0000                Median :1.0000       
##  Mean   :0.8634      Mean   : 0.8931                Mean   :0.8447       
##  3rd Qu.:1.0000      3rd Qu.: 1.0000                3rd Qu.:1.0000       
##  Max.   :1.0000      Max.   : 1.0000                Max.   :1.0000       
##  87398900 - pH 87398900 - solidos_totais 87398900 - E_coli
##  Min.   :1     Min.   :0.4234            Min.   :1        
##  1st Qu.:1     1st Qu.:0.9070            1st Qu.:1        
##  Median :1     Median :1.0000            Median :1        
##  Mean   :1     Mean   :0.8748            Mean   :1        
##  3rd Qu.:1     3rd Qu.:1.0000            3rd Qu.:1        
##  Max.   :1     Max.   :1.0000            Max.   :1        
##  87398900 - ANO_COLETA 87398900 - Condutividade 87398950 - DBO
##  Min.   :0.3526        Min.   :1                Min.   :1     
##  1st Qu.:1.0000        1st Qu.:1                1st Qu.:1     
##  Median :1.0000        Median :1                Median :1     
##  Mean   :0.9502        Mean   :1                Mean   :1     
##  3rd Qu.:1.0000        3rd Qu.:1                3rd Qu.:1     
##  Max.   :1.0000        Max.   :1                Max.   :1     
##  87398950 - nitro_kjeldahl 87398950 - nitro_total 87398950 - fosforo_total
##  Min.   :-0.5359           Min.   :0.5497         Min.   :0.5497          
##  1st Qu.: 1.0000           1st Qu.:1.0000         1st Qu.:1.0000          
##  Median : 1.0000           Median :1.0000         Median :1.0000          
##  Mean   : 0.8593           Mean   :0.9647         Mean   :0.9307          
##  3rd Qu.: 1.0000           3rd Qu.:1.0000         3rd Qu.:1.0000          
##  Max.   : 1.0000           Max.   :1.0000         Max.   :1.0000          
##  87398950 - temp_agua 87398950 - turbidez 87398950 - oxigenio_dissolvido
##  Min.   :-0.5945      Min.   :0.8455      Min.   :-0.5945               
##  1st Qu.: 1.0000      1st Qu.:1.0000      1st Qu.: 1.0000               
##  Median : 1.0000      Median :1.0000      Median : 1.0000               
##  Mean   : 0.8773      Mean   :0.9881      Mean   : 0.6475               
##  3rd Qu.: 1.0000      3rd Qu.:1.0000      3rd Qu.: 1.0000               
##  Max.   : 1.0000      Max.   :1.0000      Max.   : 1.0000               
##  87398950 - nitro_amon 87398950 - pH 87398950 - solidos_totais
##  Min.   :1             Min.   :1     Min.   :0.8455           
##  1st Qu.:1             1st Qu.:1     1st Qu.:1.0000           
##  Median :1             Median :1     Median :1.0000           
##  Mean   :1             Mean   :1     Mean   :0.9881           
##  3rd Qu.:1             3rd Qu.:1     3rd Qu.:1.0000           
##  Max.   :1             Max.   :1     Max.   :1.0000           
##  87398950 - E_coli 87398950 - ANO_COLETA 87398950 - Condutividade
##  Min.   :1         Min.   :1             Min.   :-0.4515         
##  1st Qu.:1         1st Qu.:1             1st Qu.: 1.0000         
##  Median :1         Median :1             Median : 1.0000         
##  Mean   :1         Mean   :1             Mean   : 0.8318         
##  3rd Qu.:1         3rd Qu.:1             3rd Qu.: 1.0000         
##  Max.   :1         Max.   :1             Max.   : 1.0000         
##  87398980 - DBO 87398980 - nitro_kjeldahl 87398980 - nitro_total
##  Min.   :1      Min.   :1                 Min.   :1             
##  1st Qu.:1      1st Qu.:1                 1st Qu.:1             
##  Median :1      Median :1                 Median :1             
##  Mean   :1      Mean   :1                 Mean   :1             
##  3rd Qu.:1      3rd Qu.:1                 3rd Qu.:1             
##  Max.   :1      Max.   :1                 Max.   :1             
##  87398980 - fosforo_total 87398980 - temp_agua 87398980 - turbidez
##  Min.   :1                Min.   :0.5681       Min.   :0.5681     
##  1st Qu.:1                1st Qu.:1.0000       1st Qu.:1.0000     
##  Median :1                Median :1.0000       Median :1.0000     
##  Mean   :1                Mean   :0.9668       Mean   :0.9402     
##  3rd Qu.:1                3rd Qu.:1.0000       3rd Qu.:1.0000     
##  Max.   :1                Max.   :1.0000       Max.   :1.0000     
##  87398980 - oxigenio_dissolvido 87398980 - nitro_amon 87398980 - pH
##  Min.   :1                      Min.   :1             Min.   :1    
##  1st Qu.:1                      1st Qu.:1             1st Qu.:1    
##  Median :1                      Median :1             Median :1    
##  Mean   :1                      Mean   :1             Mean   :1    
##  3rd Qu.:1                      3rd Qu.:1             3rd Qu.:1    
##  Max.   :1                      Max.   :1             Max.   :1    
##  87398980 - solidos_totais 87398980 - E_coli 87398980 - ANO_COLETA
##  Min.   :0.6547            Min.   :1         Min.   :1            
##  1st Qu.:1.0000            1st Qu.:1         1st Qu.:1            
##  Median :1.0000            Median :1         Median :1            
##  Mean   :0.9734            Mean   :1         Mean   :1            
##  3rd Qu.:1.0000            3rd Qu.:1         3rd Qu.:1            
##  Max.   :1.0000            Max.   :1         Max.   :1            
##  87398980 - Condutividade 87405500 - DBO   87405500 - nitro_kjeldahl
##  Min.   :1                Min.   :0.4199   Min.   :0.3930           
##  1st Qu.:1                1st Qu.:0.5402   1st Qu.:0.6656           
##  Median :1                Median :1.0000   Median :0.9319           
##  Mean   :1                Mean   :0.7900   Mean   :0.8206           
##  3rd Qu.:1                3rd Qu.:1.0000   3rd Qu.:1.0000           
##  Max.   :1                Max.   :1.0000   Max.   :1.0000           
##  87405500 - nitro_total 87405500 - fosforo_total 87405500 - temp_agua
##  Min.   :0.5052         Min.   :-0.3314          Min.   :0.3109      
##  1st Qu.:0.6036         1st Qu.: 0.4828          1st Qu.:0.4534      
##  Median :0.9033         Median : 0.7834          Median :0.5711      
##  Mean   :0.8197         Mean   : 0.6601          Mean   :0.7138      
##  3rd Qu.:1.0000         3rd Qu.: 1.0000          3rd Qu.:1.0000      
##  Max.   :1.0000         Max.   : 1.0000          Max.   :1.0000      
##  87405500 - turbidez 87405500 - oxigenio_dissolvido 87405500 - nitro_amon
##  Min.   :0.3797      Min.   :-0.3314                Min.   :0.4993       
##  1st Qu.:1.0000      1st Qu.: 1.0000                1st Qu.:0.7350       
##  Median :1.0000      Median : 1.0000                Median :0.9033       
##  Mean   :0.9523      Mean   : 0.8976                Mean   :0.8353       
##  3rd Qu.:1.0000      3rd Qu.: 1.0000                3rd Qu.:1.0000       
##  Max.   :1.0000      Max.   : 1.0000                Max.   :1.0000       
##  87405500 - pH    87405500 - solidos_totais 87405500 - E_coli
##  Min.   :0.3109   Min.   :0.3797            Min.   :1        
##  1st Qu.:0.4284   1st Qu.:0.4477            1st Qu.:1        
##  Median :0.5052   Median :0.6036            Median :1        
##  Mean   :0.6886   Mean   :0.6652            Mean   :1        
##  3rd Qu.:1.0000   3rd Qu.:1.0000            3rd Qu.:1        
##  Max.   :1.0000   Max.   :1.0000            Max.   :1        
##  87405500 - ANO_COLETA 87405500 - Condutividade 87406900 - DBO  
##  Min.   :1             Min.   :0.4527           Min.   :0.5144  
##  1st Qu.:1             1st Qu.:0.5737           1st Qu.:0.7408  
##  Median :1             Median :0.8099           Median :1.0000  
##  Mean   :1             Mean   :0.7836           Mean   :0.8530  
##  3rd Qu.:1             3rd Qu.:1.0000           3rd Qu.:1.0000  
##  Max.   :1             Max.   :1.0000           Max.   :1.0000  
##  87406900 - nitro_kjeldahl 87406900 - nitro_total 87406900 - fosforo_total
##  Min.   :-0.5366           Min.   :0.3926         Min.   :-0.3894         
##  1st Qu.: 0.6958           1st Qu.:0.6754         1st Qu.: 0.6154         
##  Median : 0.9305           Median :0.8658         Median : 0.7260         
##  Mean   : 0.7673           Mean   :0.8084         Mean   : 0.6906         
##  3rd Qu.: 1.0000           3rd Qu.:1.0000         3rd Qu.: 1.0000         
##  Max.   : 1.0000           Max.   :1.0000         Max.   : 1.0000         
##  87406900 - temp_agua 87406900 - turbidez 87406900 - oxigenio_dissolvido
##  Min.   :-0.3840      Min.   :-0.4238     Min.   :-0.5366               
##  1st Qu.: 0.4569      1st Qu.: 1.0000     1st Qu.: 1.0000               
##  Median : 0.6015      Median : 1.0000     Median : 1.0000               
##  Mean   : 0.6624      Mean   : 0.8905     Mean   : 0.6685               
##  3rd Qu.: 1.0000      3rd Qu.: 1.0000     3rd Qu.: 1.0000               
##  Max.   : 1.0000      Max.   : 1.0000     Max.   : 1.0000               
##  87406900 - nitro_amon 87406900 - pH    87406900 - solidos_totais
##  Min.   :0.4212        Min.   :0.3926   Min.   :0.4459           
##  1st Qu.:0.7397        1st Qu.:1.0000   1st Qu.:0.6187           
##  Median :0.8658        Median :1.0000   Median :0.6958           
##  Mean   :0.8237        Mean   :0.8628   Mean   :0.7839           
##  3rd Qu.:1.0000        3rd Qu.:1.0000   3rd Qu.:1.0000           
##  Max.   :1.0000        Max.   :1.0000   Max.   :1.0000           
##  87406900 - E_coli 87406900 - ANO_COLETA 87406900 - Condutividade
##  Min.   :1         Min.   :-0.4238       Min.   :0.4024          
##  1st Qu.:1         1st Qu.: 1.0000       1st Qu.:0.6399          
##  Median :1         Median : 1.0000       Median :0.8068          
##  Mean   :1         Mean   : 0.8905       Mean   :0.7870          
##  3rd Qu.:1         3rd Qu.: 1.0000       3rd Qu.:1.0000          
##  Max.   :1         Max.   : 1.0000       Max.   :1.0000          
##  87409900 - DBO   87409900 - nitro_kjeldahl 87409900 - nitro_total
##  Min.   :0.5624   Min.   :0.6898            Min.   :0.5245        
##  1st Qu.:1.0000   1st Qu.:0.9999            1st Qu.:0.8314        
##  Median :1.0000   Median :1.0000            Median :1.0000        
##  Mean   :0.9371   Mean   :0.9603            Mean   :0.8823        
##  3rd Qu.:1.0000   3rd Qu.:1.0000            3rd Qu.:1.0000        
##  Max.   :1.0000   Max.   :1.0000            Max.   :1.0000        
##  87409900 - fosforo_total 87409900 - temp_agua 87409900 - turbidez
##  Min.   :0.4560           Min.   :0.4309       Min.   :0.4405     
##  1st Qu.:0.8175           1st Qu.:1.0000       1st Qu.:1.0000     
##  Median :0.8565           Median :1.0000       Median :1.0000     
##  Mean   :0.8426           Mean   :0.9562       Mean   :0.9570     
##  3rd Qu.:1.0000           3rd Qu.:1.0000       3rd Qu.:1.0000     
##  Max.   :1.0000           Max.   :1.0000       Max.   :1.0000     
##  87409900 - oxigenio_dissolvido 87409900 - nitro_amon 87409900 - pH   
##  Min.   :1                      Min.   :0.7569        Min.   :0.4049  
##  1st Qu.:1                      1st Qu.:0.8915        1st Qu.:1.0000  
##  Median :1                      Median :1.0000        Median :1.0000  
##  Mean   :1                      Mean   :0.9482        Mean   :0.9542  
##  3rd Qu.:1                      3rd Qu.:1.0000        3rd Qu.:1.0000  
##  Max.   :1                      Max.   :1.0000        Max.   :1.0000  
##  87409900 - solidos_totais 87409900 - E_coli 87409900 - ANO_COLETA
##  Min.   :0.4405            Min.   :0.4528    Min.   :0.4528       
##  1st Qu.:0.5429            1st Qu.:0.5245    1st Qu.:1.0000       
##  Median :1.0000            Median :1.0000    Median :1.0000       
##  Mean   :0.8442            Mean   :0.8215    Mean   :0.9579       
##  3rd Qu.:1.0000            3rd Qu.:1.0000    3rd Qu.:1.0000       
##  Max.   :1.0000            Max.   :1.0000    Max.   :1.0000       
##  87409900 - Condutividade
##  Min.   :0.4049          
##  1st Qu.:0.4895          
##  Median :0.7254          
##  Mean   :0.7294          
##  3rd Qu.:1.0000          
##  Max.   :1.0000
parametros_IQA %>% 
  # group_by(CODIGO) %>% 
  dplyr::select(
    nitro_kjeldahl, Condutividade
  ) %>% 
  # correlation::cor_test() %>% 
  plot()

correlação-parametros-qualidade-agua-gravataí no período 1990-2020

str(
  plot(
    correlation::cor_test(
      parametros_IQA,
      "nitro_kjeldahl",
      "Condutividade"
    )
  )
)
## List of 9
##  $ data       : tibble [1,179 x 14] (S3: tbl_df/tbl/data.frame)
##   ..$ CODIGO             : chr [1:1179] "87398950" "87398900" "87405500" "87398950" ...
##   ..$ pH                 : num [1:1179] 6.9 6.8 6.6 6.4 6.9 6.7 6.6 6.7 6.3 7.1 ...
##   ..$ DBO                : num [1:1179] 5 5 11 3 3 2 4 3 4 2 ...
##   ..$ E_coli             : num [1:1179] 4 40 12.8 10.4 32 16.8 40 6.4 10.4 18.4 ...
##   ..$ nitro_amon         : num [1:1179] NA NA NA NA NA NA NA NA NA NA ...
##   ..$ nitro_kjeldahl     : num [1:1179] 1.42 1.61 6.62 0.79 1.45 0.76 1.23 1.37 2.25 1.34 ...
##   ..$ nitro_total        : num [1:1179] 1.42 1.61 6.62 0.79 1.45 0.76 1.23 1.37 2.25 1.34 ...
##   ..$ fosforo_total      : num [1:1179] 0.113 0.0883 0.353 0.0908 0.118 0.0326 0.162 0.138 0.217 0.0879 ...
##   ..$ temp_agua          : num [1:1179] 25 31 31 20 28 16 16 16 18.5 28 ...
##   ..$ turbidez           : num [1:1179] 20 20 8.5 23 19 17 12 22 17 23 ...
##   ..$ solidos_totais     : num [1:1179] 121 112 160 93 127 75 80 201 84 123 ...
##   ..$ oxigenio_dissolvido: num [1:1179] 6.5 8.7 5.3 7.8 7.6 8.5 7.3 6.9 6.7 6.3 ...
##   ..$ Condutividade      : num [1:1179] 90 47 147 43 NA 47 70 60.6 72.7 56 ...
##   ..$ ANO_COLETA         : num [1:1179] 1994 1994 1994 1993 1994 ...
##  $ layers     :List of 2
##   ..$ :Classes 'LayerInstance', 'Layer', 'ggproto', 'gg' <ggproto object: Class LayerInstance, Layer, gg>
##     aes_params: list
##     compute_aesthetics: function
##     compute_geom_1: function
##     compute_geom_2: function
##     compute_position: function
##     compute_statistic: function
##     computed_geom_params: NULL
##     computed_mapping: NULL
##     computed_stat_params: NULL
##     data: waiver
##     draw_geom: function
##     finish_statistics: function
##     geom: <ggproto object: Class GeomSmooth, Geom, gg>
##         aesthetics: function
##         default_aes: uneval
##         draw_group: function
##         draw_key: function
##         draw_layer: function
##         draw_panel: function
##         extra_params: na.rm orientation
##         handle_na: function
##         non_missing_aes: 
##         optional_aes: ymin ymax
##         parameters: function
##         required_aes: x y
##         setup_data: function
##         setup_params: function
##         use_defaults: function
##         super:  <ggproto object: Class Geom, gg>
##     geom_params: list
##     inherit.aes: TRUE
##     layer_data: function
##     map_statistic: function
##     mapping: uneval
##     position: <ggproto object: Class PositionIdentity, Position, gg>
##         compute_layer: function
##         compute_panel: function
##         required_aes: 
##         setup_data: function
##         setup_params: function
##         super:  <ggproto object: Class Position, gg>
##     print: function
##     setup_layer: function
##     show.legend: NA
##     stat: <ggproto object: Class StatSmooth, Stat, gg>
##         aesthetics: function
##         compute_group: function
##         compute_layer: function
##         compute_panel: function
##         default_aes: uneval
##         extra_params: na.rm orientation
##         finish_layer: function
##         non_missing_aes: 
##         optional_aes: 
##         parameters: function
##         required_aes: x y
##         retransform: TRUE
##         setup_data: function
##         setup_params: function
##         super:  <ggproto object: Class Stat, gg>
##     stat_params: list
##     super:  <ggproto object: Class Layer, gg> 
##   ..$ :Classes 'LayerInstance', 'Layer', 'ggproto', 'gg' <ggproto object: Class LayerInstance, Layer, gg>
##     aes_params: list
##     compute_aesthetics: function
##     compute_geom_1: function
##     compute_geom_2: function
##     compute_position: function
##     compute_statistic: function
##     computed_geom_params: NULL
##     computed_mapping: NULL
##     computed_stat_params: NULL
##     data: tbl_df, tbl, data.frame
##     draw_geom: function
##     finish_statistics: function
##     geom: <ggproto object: Class GeomPoint, Geom, gg>
##         aesthetics: function
##         default_aes: uneval
##         draw_group: function
##         draw_key: function
##         draw_layer: function
##         draw_panel: function
##         extra_params: na.rm
##         handle_na: function
##         non_missing_aes: size shape colour
##         optional_aes: 
##         parameters: function
##         required_aes: x y
##         setup_data: function
##         setup_params: function
##         use_defaults: function
##         super:  <ggproto object: Class Geom, gg>
##     geom_params: list
##     inherit.aes: TRUE
##     layer_data: function
##     map_statistic: function
##     mapping: uneval
##     position: <ggproto object: Class PositionIdentity, Position, gg>
##         compute_layer: function
##         compute_panel: function
##         required_aes: 
##         setup_data: function
##         setup_params: function
##         super:  <ggproto object: Class Position, gg>
##     print: function
##     setup_layer: function
##     show.legend: NA
##     stat: <ggproto object: Class StatIdentity, Stat, gg>
##         aesthetics: function
##         compute_group: function
##         compute_layer: function
##         compute_panel: function
##         default_aes: uneval
##         extra_params: na.rm
##         finish_layer: function
##         non_missing_aes: 
##         optional_aes: 
##         parameters: function
##         required_aes: 
##         retransform: TRUE
##         setup_data: function
##         setup_params: function
##         super:  <ggproto object: Class Stat, gg>
##     stat_params: list
##     super:  <ggproto object: Class Layer, gg> 
##  $ scales     :Classes 'ScalesList', 'ggproto', 'gg' <ggproto object: Class ScalesList, gg>
##     add: function
##     clone: function
##     find: function
##     get_scales: function
##     has_scale: function
##     input: function
##     n: function
##     non_position_scales: function
##     scales: list
##     super:  <ggproto object: Class ScalesList, gg> 
##  $ mapping    : Named list()
##   ..- attr(*, "class")= chr "uneval"
##  $ theme      : list()
##  $ coordinates:Classes 'CoordCartesian', 'Coord', 'ggproto', 'gg' <ggproto object: Class CoordCartesian, Coord, gg>
##     aspect: function
##     backtransform_range: function
##     clip: on
##     default: TRUE
##     distance: function
##     expand: TRUE
##     is_free: function
##     is_linear: function
##     labels: function
##     limits: list
##     modify_scales: function
##     range: function
##     render_axis_h: function
##     render_axis_v: function
##     render_bg: function
##     render_fg: function
##     setup_data: function
##     setup_layout: function
##     setup_panel_guides: function
##     setup_panel_params: function
##     setup_params: function
##     train_panel_guides: function
##     transform: function
##     super:  <ggproto object: Class CoordCartesian, Coord, gg> 
##  $ facet      :Classes 'FacetNull', 'Facet', 'ggproto', 'gg' <ggproto object: Class FacetNull, Facet, gg>
##     compute_layout: function
##     draw_back: function
##     draw_front: function
##     draw_labels: function
##     draw_panels: function
##     finish_data: function
##     init_scales: function
##     map_data: function
##     params: list
##     setup_data: function
##     setup_params: function
##     shrink: TRUE
##     train_scales: function
##     vars: function
##     super:  <ggproto object: Class FacetNull, Facet, gg> 
##  $ plot_env   :<environment: 0x000000002714d730> 
##  $ labels     :List of 4
##   ..$ title   : NULL
##   ..$ subtitle: chr "r = 0.83, 95% CI [0.81, 0.86], t(605) = 36.90, p < .001"
##   ..$ x       : chr "nitro_kjeldahl"
##   ..$ y       : chr "Condutividade"
##  - attr(*, "class")= chr [1:2] "gg" "ggplot"

Time for this code chunk to run: 3.08213806152344

9.1.2 Condutividade elétrica

(cond_elet <- ggplot(plan_wide_19902020,
                        aes(CODIGO,
                            Condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   facet_wrap(~periodo)+
      labs(title = "Condutividade elétrica no período 1990-2020",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$Condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

condutividade-eletrica-gravataí no período 1990-2020Time for this code chunk to run: 1.33976292610168

(cond_elet_p1 <- ggplot(plan_wide_19902020 %>% 
                          filter(ANO_COLETA>"2000" &
                                   ANO_COLETA<="2010"),
                        aes(CODIGO,
                            Condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
      labs(title = "Condutividade elétrica no período 1990-2000",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$Condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.539109945297241

(cond_elet_p2 <- ggplot(plan_wide_19902020 %>% 
                          filter(ANO_COLETA>"2000" &
                                   ANO_COLETA<="2010"),
                        aes(CODIGO,
                            Condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Condutividade elétrica no período 2000-2010",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$Condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.5989830493927

(cond_elet_p3 <- ggplot(plan_wide_19902020 %>% 
                          filter(ANO_COLETA>"2010" &
                                   ANO_COLETA<="2020"),
                        aes(CODIGO,
                            Condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Condutividade elétrica no período 2010-2020",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$Condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.633574962615967

grid.arrange(cond_elet_p1, cond_elet_p2, cond_elet_p3, ncol = 3)

Time for this code chunk to run: 1.53266501426697

(sum_cond_elet_p1 <- plan_wide_19902020 %>%
   select(CODIGO, Condutividade, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(Condutividade, 
           na.rm = TRUE),
     q1 = 
       quantile(Condutividade, 0.25, 
                na.rm = TRUE),
     median = 
       median(Condutividade, 
              na.rm = TRUE),
     mean = 
       mean(Condutividade, 
            na.rm= TRUE),
     q3 = 
       quantile(Condutividade, 0.75, 
                na.rm = TRUE),
     max = 
       max(Condutividade, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   9.4  51.1   67    75.1  83.2 340  
## 2 87398900  10    41.5   51    55.3  64.2 160  
## 3 87398950   9    41.5   51.5  60.1  69.5 160  
## 4 87398980  11.3  42.4   52.0  53.0  67.0  83.8
## 5 87405500  25    68.7   88.2 130.  170   560  
## 6 87406900  52    88.4  133.  193.  256.  576  
## 7 87409900  29    80    110.  134.  168.  460
(sum_cond_elet_p2 <- plan_wide_19902020 %>%
    select(CODIGO, Condutividade, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(Condutividade, 
            na.rm = TRUE),
      q1 = 
        quantile(Condutividade, 0.25, 
                 na.rm = TRUE),
      median = 
        median(Condutividade, 
               na.rm = TRUE),
      mean = 
        mean(Condutividade, 
             na.rm= TRUE),
      q3 = 
        quantile(Condutividade, 0.75, 
                 na.rm = TRUE),
      max = 
        max(Condutividade, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  11.9  67.0   82.6  84.8 102.   164.
## 2 87398900  11    44.4   52.3  57.1  72.6  136.
## 3 87398950  39.8  58.4   76    82.3  98.3  160 
## 4 87398980   9.4  42.4   49.7  51.5  62    114.
## 5 87405500  17    77.5  107   142.  171.   679 
## 6 87406900  23.1  85.6  124.  164.  199.   619 
## 7 87409900  56.1 114.   177   200.  242    454
(sum_cond_elet_p3 <- plan_wide_19902020 %>%
    select(CODIGO, Condutividade, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(Condutividade, 
            na.rm = TRUE),
      q1 = 
        quantile(Condutividade, 0.25, 
                 na.rm = TRUE),
      median = 
        median(Condutividade, 
               na.rm = TRUE),
      mean = 
        mean(Condutividade, 
             na.rm= TRUE),
      q3 = 
        quantile(Condutividade, 0.75, 
                 na.rm = TRUE),
      max = 
        max(Condutividade, 
            na.rm = TRUE),
      n = 
        length(Condutividade))
)
## # A tibble: 7 x 8
##   CODIGO     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  0.01  68.5   80.2  80.4  99.5 125.     34
## 2 87398900 39.7   53.4   58.3  61.1  65.5 103      36
## 3 87398950 40.9   64.7   70.1  76.1  82.5 195.     35
## 4 87398980 43.2   51.7   54.0  56.3  61.0  78.9    28
## 5 87405500 47     85.8  121.  146.  209.  286      33
## 6 87406900 62.7   95.9  142.  163.  216.  354.     35
## 7 87409900 65.7  121.   159.  179.  245.  498.     37
# plan_wide_19902020 %>% 
#    select(CODIGO, IQA) %>% 
#    group_by(CODIGO) %>% 
#    summarize(
#       min = 
#          min(IQA, 
#              na.rm = TRUE),
#       q1 = 
#          quantile(IQA, 0.25, 
#                   na.rm = TRUE),
#       median = 
#          median(IQA, 
#                 na.rm = TRUE),
#       mean = 
#          mean(IQA, 
#               na.rm= TRUE),
#       q3 = 
#          quantile(IQA, 0.75, 
#                   na.rm = TRUE),
#       max = 
#          max(IQA, 
#              na.rm = TRUE))

Time for this code chunk to run: 0.181599855422974

ggsave("cond_elet.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = cond_elet,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_p1.png",
       plot = cond_elet_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_p2.png",
       plot = cond_elet_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_p3.png",
       plot = cond_elet_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(cond_elet_p1, cond_elet_p2, cond_elet_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 6.05720901489258

9.2 Textando o texto

  • § falar do comportamento geral dos dados
  • 2º § - xº § -> abordar os principais parâmetros que estão sendo impactados, detalhando, nas estações mais relevantes, como ficaram os quartis/mediana etc.

10.8

Os resultados apontam que para o parâmetro OD

LS0tDQp0aXRsZTogIlRDQyINCmF1dGhvcjogIkxlb25hcmRvIEZlcm5hbmRlcyBXaW5rIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQvJW0vJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGRpc3RpbGw6OmRpc3RpbGxfYXJ0aWNsZToNCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sNCiAgICBrZWVwX21kOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICAgIHNtb290aF9zY3JvbGw6IG5vDQogICAgZmlnX3dpZHRoOiAxMA0KICAgIGZpZ19oZWlnaHQ6IDYuNjYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgZ2l0aHViX2RvY3VtZW50Og0KICAgIGh0bWxfcHJldmlldzogdHJ1ZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KZmlnLmFsaWduOiBjZW50ZXINCi0tLQ0KDQpgYGB7ciBSb3RpbmEgcHJhIHRvZGEgdmV6IHF1ZSBhYnJpciBvIGRvY3VtZW50bywgZWNobyA9IEZBTFNFfQ0KIyBBYnJpciBvIEdpdEh1YiBEZXNrdG9wDQojIFZlcmlmaWNhciBzZSBow6EgcHVsbCBwcmEgc2VyIGZlaXRvDQojIEFicmlyIG8gUlN0dWRpbw0KYGBgDQoNCiMgQnJpZWYgZXhwbGFuYXRpb24NCg0KRXZlcnkgYm94cGxvdCBtZWFucyBhIG1vbml0b3JpbmcgcG9pbnQgKFBvbnRvIGRlIG1vbml0b3JhbWVudG8gKG9yIFBNKSBpbiBwb3J0dWd1ZXNlKS4gTXkgZ29hbCBoZXJlIGlzIHRvIGFuYWx5emUgdGhlIGV2b2x1dGlvbiBiZXR3ZWVuIGRlY2FkZXMgb2YgZWFjaCB3YXRlciBxdWFsaXR5IHBhcmFtZXRlciB0aGF0IGNvbXBvdW5kcyB0aGUgV2F0ZXIgUXVhbGl0eSBJbmRleCAoV1FJKS4NCg0KVGhlIHJpdmVyIGZsb3dzIGluIHRoZSBlYXN0LXdlc3QgZGlyZWN0aW9uIGFzIHNob3duIGluIHRoZSBpbWFnZSBiZWxvdy4NCg0KIVtdKGltYWdlcy9wYXN0ZS03QUQ3MDI3Ri5wbmcpDQoNClRoZSBsb2dpYyBiZWhpbmQgdGhlIHNvcnRpbmcgaW4gdGhlIGJveHBsb3RzIGlzIGJlY2F1c2Ugb2YgMiBtYWluIHJlYXNvbnM6DQoNCjEuICBUaGUgb3JpZ2luYWwgbW9uaXRvcmluZyBwb2ludCBpc24ndCBlYXN5IHRvIHVuZGVyc3RhbmQgKDggZGlnaXRzLCBsaWtlIDg3NDA5OTAwKQ0KMi4gIENoYW5naW5nIHRoZSBvcmlnaW5hbCBub21lbmNsYXR1cmUgdG8gUE0xLCBQTTIgKC4uLikgbWFrZXMgaXQgZWFzaWVyIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgbGFzdCBwb2ludCBoYXMgd2F0ZXIgY29udHJpYnV0aW9ucyBvZiBldmVyeSBvdGhlciBwb2ludCB1cHN0cmVhbS4NCg0KU29tZSBmZWF0dXJlcyB0aGF0IEkgd2FudCB0byBhZGQ6DQotIElmIHRoZSBwYXJhbWV0ZXIgaXMgeCwgdGhlbiB1c2UgeCdzIGNsYXNzZXMgKHdpdGggaXRzIG93biBjbGFzc2VzIGJhY2tncm91bmQgY29sb3IgcGxvdHRlZCkNCi0gRGVmaW5lIHRoZSB0aW1lc2NhbGUsIHNob3VsZCBhY3QganVzdCBsaWtlIGEgZmlsdGVyDQoNCmBgYHtyIHAxIGV4YW1wbGUsIGV2YWw9RkFMU0V9DQojIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQojICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMDAiKQ0KYGBgDQoNCiMgQW5vdGHDp8O1ZXMgZGUgY29pc2FzIHBvciBmYXplcjoNCg0KLSAgIERlc2NvYnJpciBjb21vIGNvbG9jYXIgYXMgZXN0YcOnw7VlcyBubyBzZW50aWRvIGNvcnJldG8gbW9udGFudGUgLVw+IGp1c2FudGUgbm9zIHN1bcOhcmlvcw0KDQo+IDg3Mzk4NTAwLCA4NzM5ODk4MCwgODczOTg5MDAsIDg3Mzk4OTUwLCA4NzQwNTUwMCwgODc0MDY5MDAsIDg3NDA5OTAwDQoNCi0gICB+fkFwcmVuZGVyIGEgc2VnbWVudGFyIG8gbWV1IGRhdGFzZXQgcG9yIHBlcsOtb2Rvc35+DQotICAgYXByZW5kZXIgYSBjcmlhciB1bWEgbm92YSBjb2x1bmEgY29tIGEgc2VnbWVudGHDp8OjbyBkb3MgcGVyw61vZG9zDQotICAgbWF5YmUgdXNlIGB+ZmFjZXQuZ3JpZGANCi0gICBhcHJlbmRlciBhIGNvbG9jYXIgYSBsZWdlbmRhIGRlbnRybyBkbyBncsOhZmljbw0KICAgIC0gICByZWR1emlyIG8gdGFtYW5obyBkYSBsZWdlbmRhDQotICAgfn5jb3JyaWdpciBvcyB2YWxvcmVzIDAgZGUgSVFBIHByYSBOQX5+DQotICAgZGVzY29icmlyIGNvbW8gY29uc2VndWlyIGEgZXF1YcOnw6NvIGRvIGxtDQotICAgfn5hcHJlbmRlciBhIHBpdm90YXIgbyBzdW3DoXJpb35+IC1cPiBtZXUgc3Vtw6FyaW8gZG8gZ29vZ2xlIGRvY3MgdGEgYmF0ZW5kbyBkaXJlaXRpbmhvIGNvbSBvIGRvIFINCi0gICBkZXNjb2JyaXIgc2UgaMOhIG91dHJvcyBUQ0NzIGNvbSBkaXNwb25pYmlsaXphw6fDo28gZGUgY8OzZGlnb3MNCi0gICBgTmFtb25gIHTDoSBjb20gY29tIGNhc2EgZGVjaW1hbCBgIiwiYCBlIGBwdG90YCB0w6EgY29tIGAiLiJgDQotICAgY29ycmVsYcOnw6NvIGZvcnRlIGVudHJlIGNvbmR1dGl2aWRhZGUgZSBOYW1vbi9QdG90L0RCTw0KDQp8IDE5OTAtMjAwMCB8IDIwMDAtMjAxMCB8IDIwMTAtMjAyMCB8DQp8Oi0tLS0tLS0tLTp8Oi0tLS0tLS0tLTp8Oi0tLS0tLS0tLTp8DQp8IDE5OTAtMjAwMCB8IDIwMDAtMjAxMCB8IDIwMTAtMjAyMCB8DQoNCiMgSW5zdGFsYXIgb3MgcGFjb3Rlcw0KDQpgYGB7ciBpbnN0YWxhciBwYWNvdGVzLCBldmFsPUZBTFNFfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKHRpZHl2ZXJzZSkNCmBgYA0KDQojIyBhY2Vzc2FyIG9zIHBhY290ZXMNCg0KYGBge3IgQWNlc3NhciBvcyBwYWNvdGVzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBUUlVFfQ0KIyBsaWJyYXJ5KHJlYWRyKQ0KIyBsaWJyYXJ5KHJtYXJrZG93bikNCiMgIyBsaWJyYXJ5KHFib3hwbG90KQ0KIyBsaWJyYXJ5KHJlYWR4bCkNCiMgbGlicmFyeShwaWxsYXIpDQojIGxpYnJhcnkoZHBseXIpDQojIGxpYnJhcnkodGlkeXZlcnNlKQ0KIyBsaWJyYXJ5KGdhcG1pbmRlcikNCiMgbGlicmFyeShrbml0cikNCiMgbGlicmFyeShrYWJsZUV4dHJhKQ0KIyBsaWJyYXJ5KGdncHVicikNCiMgbGlicmFyeShncmlkRXh0cmEpDQojIGxpYnJhcnkobW9kZWxzdW1tYXJ5KQ0KIyBsaWJyYXJ5KGd0c3VtbWFyeSkNCiMgbGlicmFyeShHR2FsbHkpDQpwYWNtYW46OnBfbG9hZChyZWFkciwgcm1hcmtkb3duLCByZWFkeGwsDQogICAgICAgICAgICAgICBwaWxsYXIsIGRwbHlyLCB0aWR5dmVyc2UsDQogICAgICAgICAgICAgICBnYXBtaW5kZXIsIGtuaXRyLCBrYWJsZUV4dHJhLA0KICAgICAgICAgICAgICAgZ3JpZEV4dHJhLCAjbW9kZWxzdW1tYXJ5LCANCiAgICAgICAgICAgICAgIGd0c3VtbWFyeSwgZ2dwbG90MiwNCiAgICAgICAgICAgICAgIGdnYmVlc3dhcm0sIEdHYWxseSwNCiAgICAgICAgICAgICAgIHJlcG9ydCkNCiMgcGFjbWFuOjpwX2xvYWQodGliYmxldGltZSkNCmNpdGVfcGFja2FnZXMoKQ0KYGBgDQoNCmBgYHtyIGNyb25vbWV0cmFuZG8gcXVhbnRvIHRlbXBvIGNhZGEgY2h1bmsgbGV2YX0NCmtuaXRyOjprbml0X2hvb2tzJHNldCh0aW1lX2l0ID0gbG9jYWwoew0KICAgbm93IDwtIE5VTEwNCiAgIGZ1bmN0aW9uKGJlZm9yZSwgb3B0aW9ucykgew0KICAgICAgaWYgKGJlZm9yZSkgew0KICAgICAgICAgIyByZWNvcmQgdGhlIGN1cnJlbnQgdGltZSBiZWZvcmUgZWFjaCBjaHVuaw0KICAgICAgICAgbm93IDw8LSBTeXMudGltZSgpDQogICAgICB9IGVsc2Ugew0KICAgICAgICAgIyBjYWxjdWxhdGUgdGhlIHRpbWUgZGlmZmVyZW5jZSBhZnRlciBhIGNodW5rDQogICAgICAgICByZXMgPC0gZGlmZnRpbWUoU3lzLnRpbWUoKSwgbm93KQ0KICAgICAgICAgIyByZXR1cm4gYSBjaGFyYWN0ZXIgc3RyaW5nIHRvIHNob3cgdGhlIHRpbWUNCiAgICAgICAgIHBhc3RlKCJUaW1lIGZvciB0aGlzIGNvZGUgY2h1bmsgdG8gcnVuOiIsIHJlcykNCiAgICAgIH0NCiAgIH0NCn0pKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQodGltZV9pdCA9IFRSVUUpDQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyMgcmVmZXJlbmNpYW5kbyBvcyBwYWNvdGVzDQpgYGB7ciByZWZlcmVuY2lhbmRvIG9zIHBhY290ZXN9DQp2ZXJzaW9uJHZlcnNpb24uc3RyaW5nDQpjaXRhdGlvbihwYWNrYWdlID0gInRpZHl2ZXJzZSIpDQpgYGANCg0KDQojIyBpbXBvcnRhbmRvIGEgcGxhbmlsaGENCg0KYGBge3IgSW1wb3J0YW5kbyBhIHBsYW5pbGhhLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0V9DQpwbGFuX3dpZGVfMTk5MDIwMjAgPC0gcmVhZF9kZWxpbSgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2xlb25hcmRvZndpbmsvVENDX2doL21haW4vcGxhbl93aWRlXzE5OTAyMDIwLnRzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJcdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxjYWxpbmlkYWRlID0gY29sX2RvdWJsZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RJR08gPSBjb2xfY2hhcmFjdGVyKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT09SRF9HRU9fTEFUX0dSQVUgPSBjb2xfZG91YmxlKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPT1JEX0dFT19MT05HX0dSQVUgPSBjb2xfZG91YmxlKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfQ09MRVRBID0gY29sX2RhdGUoZm9ybWF0ID0gIiVkLyVtLyVZIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pdHJhdG8gPSBjb2xfZG91YmxlKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaXRyaXRvID0gY29sX2RvdWJsZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFQgPSBjb2xfZG91YmxlKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1QgPSBjb2xfZG91YmxlKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBWYXphb2AgPSBjb2xfZG91YmxlKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVmF6YW8gcmlvYCA9IGNvbF9kb3VibGUoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uYW1lcyA9ICJwdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsX21hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nX21hcmsgPSAiIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW1fd3MgPSBUUlVFDQopICU+JSANCiAgcmVuYW1lKA0KICAgIEVfY29saSA9IGBFc2NoZXJpY2hpYSBjb2xpYCwNCiAgICBmb3NmYXRvX29ydG8gPSBgRm9zZmF0byBvcnRvYCwNCiAgICBmb3Nmb3JvX3RvdGFsID0gYEbDs3Nmb3JvIHRvdGFsYCwNCiAgICBuaXRyb19vcmdhbmljbyA9IGBOaXRyb2fDqm5pbyBvcmfDom5pY29gLA0KICAgIG5pdHJvX2Ftb24gPSBgTml0cm9nw6puaW8gYW1vbmlhY2FsYCwNCiAgICBuaXRyb19ramVsZGFobCA9IGBOaXRyb2fDqm5pbyBLamVsZGFobGAsDQogICAgbml0cm9fdG90YWwgPSBgTml0cm9nw6puaW8gdG90YWxgLA0KICAgIG94aWdlbmlvX2Rpc3NvbHZpZG8gPSBgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLA0KICAgIHNhdF9PRCA9IGAlc2F0IE9EYCwNCiAgICB0ZW1wX2FndWEgPSBgVGVtcGVyYXR1cmEgw6FndWFgLA0KICAgIHRlbXBfYXIgPSBgVGVtcGVyYXR1cmEgYXJgLA0KICAgIHRyYW5zcGFyZW5jaWFfYWd1YSA9IGBUcmFuc3BhcsOqbmNpYSDDoWd1YWAsDQogICAgdmF6YW9fcmlvID0gYFZhemFvIHJpb2AsDQogICAgY29saWZvcm1lc190ZXJtbyA9IGBDb2xpZm9ybWVzIHRlcm1vdG9sYCwNCiAgICB0dXJiaWRleiA9IFR1cmJpZGV6LA0KICAgIHNvbGlkb3NfdG90YWlzID0gYFPDs2xpZG9zIHRvdGFpc2AsDQogICkNCg0KZ2xpbXBzZShwbGFuX3dpZGVfMTk5MDIwMjApDQojIHRlc3RlIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBkcGx5cjo6ZmlsdGVyKERBVEFfQ09MRVRBID49IGFzLlBPU0lYY3QoIjIwMTAtMDEtMDEiKSkgI3RoaXMgd29ya3MNCiMgDQojIHRlc3RlJERBVEFfQ09MRVRBIDwtIGFzLlBPU0lYY3QodGVzdGUkREFUQV9DT0xFVEEpDQojIA0KIyB0ZXN0ZSAlPiUgDQojICAgZHBseXI6OmFycmFuZ2UoREFUQV9DT0xFVEEpDQojIHRlc3RlICU+JSANCiMgICBmaWx0ZXJfdGltZSh0aW1lX2Zvcm11bGEgPSAnMjAxMy0wMS0wMScgfiAnMjAyMC0xMi0zMScpDQojIA0KIyANCiMgdHlwZW9mKHRlc3RlJERBVEFfQ09MRVRBKQ0KIyANCiMgICBhc190YmxfdGltZShwbGFuX3dpZGVfMTk5MDIwMjAsIGluZGV4ID0gREFUQV9DT0xFVEEpDQojIHN0cihwbGFuX3dpZGVfMTk5MDIwMjAkREFUQV9DT0xFVEEpDQpgYGANCg0KYGBge3IgVmlzdWFsaXphw6fDo28gZGEgcGxhbmlsaGEgaW1wb3J0YWRhLCBlY2hvID0gRkFMU0V9DQpwYWdlZF90YWJsZShwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChyb3dzLnByaW50ID0gMTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzLnByaW50ID0gMTApKQ0KYGBgDQoNCiMgZGF0YSB3cmFuZ2xpbmcNCg0KYGBge3IgZGF0YSB3cmFuZ2xpbmd9DQojIENvbW8gaMOhIGRhZG9zIGZhbHRhbnRlcywgbm8gY8OhbGN1bG8gZW50cmUgbyBwcm9kdXRvIGRhcyBjb2x1bmFzLCBlbGUgYWNhYmEgaW50ZXJwcmV0YW5kbyBjb21vIHNlIGZvc3NlIHplcm8sIG1hcyBuYSB2ZXJkYWRlIMOpIE5BDQpwbGFuX3dpZGVfMTk5MDIwMjAgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgIG11dGF0ZShJUUEgPSBpZmVsc2UoSVFBID09IDAsIE5BLCBJUUEpKQ0KDQpwYXJhbWV0cm9zX0lRQSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogIHNlbGVjdChDT0RJR08sDQogICAgICAgICBwSCwNCiAgICAgICAgIERCTywNCiAgICAgICAgIEVfY29saSwNCiAgICAgICAgIG5pdHJvX2Ftb24sDQogICAgICAgICBuaXRyb19ramVsZGFobCwNCiAgICAgICAgIG5pdHJvX3RvdGFsLA0KICAgICAgICAgZm9zZm9yb190b3RhbCwNCiAgICAgICAgIHRlbXBfYWd1YSwNCiAgICAgICAgIHR1cmJpZGV6LA0KICAgICAgICAgc29saWRvc190b3RhaXMsDQogICAgICAgICBveGlnZW5pb19kaXNzb2x2aWRvLA0KICAgICAgICAgQ29uZHV0aXZpZGFkZSwNCiAgICAgICAgIEFOT19DT0xFVEEpDQoNCndyaXRlLmNzdihwYXJhbWV0cm9zX0lRQSwNCiAgICAgICAgICAiLi9wYXJhbWV0cm9zX0lRQS5jc3YiLA0KICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICBzZWxlY3Qoc3RhcnRzX3dpdGgoIklRQV9eIikpICU+JSANCiAgbXV0YXRlKA0KICAgIFRFU1RBTkRPSVFBID0gcHJvZCgpDQogICkNCiMgbGlicmFyeShwZXJmb3JtYW5jZSkNCiMgbW9kZWxvIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQojICAgc2VsZWN0KENPRElHTywgb3hpZ2VuaW9fZGlzc29sdmlkbywgcGVyaW9kbykgJT4lIA0KIyAgIGdyb3VwX2J5KENPRElHTywgcGVyaW9kbykgJT4lIA0KIyAgIGxtKCkgJT4lIA0KIyAgIHBlcmZvcm1hbmNlOjpjaGVja19kaXN0cmlidXRpb24oKQ0KIyAjIGxtKCkNCiMgDQojIGNoZWNrX21vZGVsKG1vZGVsbykNCiMgcGVyZm9ybWFuY2U6OmNoZWNrX2F1dG9jb3JyZWxhdGlvbihtb2RlbG8pDQoNCmBgYA0KDQpgYGB7ciBDw7NkaWdvcyBHaXQsIGVjaG8gPSBGQUxTRX0NCiMgY2QgbXlyZXBvDQojIGxzDQojIGhlYWQgUkVBRE1FLm1kDQojIGdpdCBzdGF0dXMNCiMgZ2l0IGFkZCBSRUFETUUubWQNCiMgZ2l0IGNvbW1pdCAtbSAiQSBjb21taXQgZnJvbSBteSBsb2NhbCBjb21wdXRlciINCiMgDQojIGNkIC4uICMgdm9sdGFyIHBybyBkaXJldMOzcmlvIGFjaW1hDQojIHJtIC1yZiBteXJlcG8vICNyZW1vdmVyL2FwYWdhciBhIHBhc3RhIG15cmVwbw0KYGBgDQoNCmBgYHtyIEFwcmVuZGVuZG8gR2l0LCBlY2hvID0gRkFMU0V9DQojIHNsaWRlcyBkYSBiaWEgcXVlIGFqdWRhbSBtdA0KIyBodHRwczovL2JlYXRyaXptaWx6LmdpdGh1Yi5pby9zbGlkZXNSL2dpdF9yc3R1ZGlvLzExLTIwMjEtRU5DRS5odG1sIzIwDQojIGFwcmVuZGVuZG8gYSBzaW5jcm9uaXphciB1c2FuZG8gZXNzZSBndWlhIC0+IA0KIyBodHRwczovL2hhcHB5Z2l0d2l0aHItY29tLnRyYW5zbGF0ZS5nb29nL3B1c2gtcHVsbC1naXRodWIuaHRtbD9feF90cl9zbD1hdXRvJl94X3RyX3RsPXB0Jl94X3RyX2hsPXB0LUJSDQojIGxpYnJhcnkodXNldGhpcykNCiMgdXNldGhpczo6Y3JlYXRlX2dpdGh1Yl90b2tlbigpIGNyaWFyIHVtIGPDs2RpZ28gcHJhIGFjZXNzbyBlIHNpbmNyb25pemHDp8OjbyBiZXR3ZWVuIFIgZSBnaXRodWINCg0KIyBnaXRjcmVkczo6Z2l0Y3JlZHNfc2V0KCkgDQojIA0KIyB1c2VfZ2l0X2NvbmZpZyh1c2VyLm5hbWUgPSAibGVvbmFyZG9md2luayIsDQojICAgICAgICAgICAgICAgIHVzZXIuZW1haWwgPSAibGVvbmFyZG9md2lua0BnbWFpbC5jb20iKQ0KIyB1c2V0aGlzOjpnaF90b2tlbl9oZWxwKCkNCg0KIyBDb21vIG1vc3RyYXIgb3MgZGFkb3MgZGUgdW0gYXJxdWl2byB2aWEgR2l0L0dpdEh1Yg0KIyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2xlb25hcmRvZndpbmsvbXlyZXBvLmdpdA0KIyBjZCBteXJlcG8gI2FjZXNzYSBhIHBhc3RhIG15cmVwbw0KIyBscyAjbGlzdGEgb3MgYXJxdWl2b3MgZGEgcGFzdGEgDQojIGhlYWQgUkVBRE1FLm1kICNtb3N0cmEgYXMgcHJpbWVpcmFzIG9ic2VydmHDp8O1ZXMgZG8gYXJxdWl2bw0KDQojIENvbW8gbW9zdHJhciBvcyBkYWRvcyBkZSB1bSBhcnF1aXZvIHZpYSBSDQojIGhlYWQoQzovVXNlcnMvTMOpby9teXJlcG8vUkVBRE1FLm1kKQ0KDQojIEFkaWNpb25hciB1bWEgbGluaGEgYW8gUkVBRE1FLm1kIGUgdmVyaWZpY2FyIHNlIG8gR2l0IHBlcmNlYmUgYSBtdWRhbsOnYQ0KIyBlY2hvICJBIGxpbmUgSSB3cm90ZSBvbiBteSBsb2NhbCBjb21wdXRlciIgPj4gUkVBRE1FLm1kDQojIGdpdCBzdGF0dXMNCiMjIEM6XFVzZXJzXEzDqW9cbXlyZXBvPmdpdCBzdGF0dXMNCiMjIE9uIGJyYW5jaCBtYWluDQojIyBZb3VyIGJyYW5jaCBpcyB1cCB0byBkYXRlIHdpdGggJ29yaWdpbi9tYWluJy4NCiMjIA0KIyMgQ2hhbmdlcyBub3Qgc3RhZ2VkIGZvciBjb21taXQ6DQojIyAgICh1c2UgImdpdCBhZGQgPGZpbGU+Li4uIiB0byB1cGRhdGUgd2hhdCB3aWxsIGJlIGNvbW1pdHRlZCkNCiMjICAgKHVzZSAiZ2l0IHJlc3RvcmUgPGZpbGU+Li4uIiB0byBkaXNjYXJkIGNoYW5nZXMgaW4gd29ya2luZyBkaXJlY3RvcnkpDQojIyAgICAgICAgICoqbW9kaWZpZWQ6ICAgUkVBRE1FLm1kKioNCiMjIA0KIyMgbm8gY2hhbmdlcyBhZGRlZCB0byBjb21taXQgKHVzZSAiZ2l0IGFkZCIgYW5kL29yICJnaXQgY29tbWl0IC1hIikNCmBgYA0KDQojIHNldHRpbmcgdGhlbWUNCg0KYGBge3Igc2V0dGluZyB0aGVtZX0NCnRoZW1lX2dyYWZzIDwtIGZ1bmN0aW9uKGJnID0gIndoaXRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcmFjYW9fbGV0cmEgPSAiYmxhY2siKSB7DQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSANCiAgICAgIGVsZW1lbnRfdGV4dCgNCiAgICAgICAgaGp1c3QgPSAwLjUsDQogICAgICAgIGNvbG9yID0gY29sb3JhY2FvX2xldHJhLA0KICAgICAgICBzaXplID0gMTkpLA0KICAgIA0KICAgIGF4aXMudGl0bGUueCA9IA0KICAgICAgIyBlbGVtZW50X3RleHQoDQogICAgICAjIGNvbG9yID0gY29sb3JhY2FvX2xldHJhLA0KICAgICAgIyBzaXplID0gMTUsDQogICAgICAjIGFuZ2xlID0gMCwpLA0KICAgICAgZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGNvbG9yID0gY29sb3JhY2FvX2xldHJhLA0KICAgICAgc2l6ZSA9IDE1LA0KICAgICAgYW5nbGUgPSA5MCksDQogICAgDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoDQogICAgICBjb2xvciA9IGNvbG9yYWNhb19sZXRyYSwNCiAgICAgIHNpemUgPSAxNyksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICBjb2xvciA9IGNvbG9yYWNhb19sZXRyYSwNCiAgICAgIHNpemUgPSAxNywNCiAgICAgIGFuZ2xlID0gMCksDQogICAgDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gYmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gYmcpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gYmcpLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKGwgPSA1LCByID0gMTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgYiA9IDUsIHQgPSA1KQ0KICApDQp9DQpgYGANCg0KIyBzZXR0aW5nIGRpZmZlcmVudCB0aW1lc2NhbGVzDQoNCmBgYHtyIHNldHRpbmcgcGVyaW9kb3MsIGVjaG8gPSBGQUxTRX0NCnBsYW5fd2lkZV8xOTkwMjAyMCA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAjIHNlbGVjdChDT0RJR08sIEFOT19DT0xFVEEpICU+JSANCiAgbXV0YXRlKA0KICAgIHBlcmlvZG8gPSBpZl9lbHNlKA0KICAgICAgQU5PX0NPTEVUQSA8PSAyMDAwLCANCiAgICAgICIxOTkwLTIwMDAiLA0KICAgICAgaWZfZWxzZSgNCiAgICAgICAgQU5PX0NPTEVUQSA8PSAyMDEwLA0KICAgICAgICAiMjAwMC0yMDEwIiwNCiAgICAgICAgIjIwMTAtMjAyMCINCiAgICAgICkNCiAgICApDQogICkNCmBgYA0KDQojIHNldHRpbmcgc3VtYXJpZXMNCg0KYGBge3IgU3Vtw6FyaW9zLCBlY2hvID0gRkFMU0V9DQojIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBhc190aWJibGUoKSAlPiUgDQojICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMTk5MCIgJg0KIyAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMDAiKSAlPiUgDQojICAgc2VsZWN0KGNvbG5hbWVzKHBhcmFtZXRyb3NfSVFBKSkgJT4lIA0KIyAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KIyAgIGdyb3VwX2J5KGNvbG5hbWVzKHBhcmFtZXRyb3NfSVFBKSkgJT4lIA0KIyAgIHN1bW1hcmlzZV9lYWNoKA0KIyAgICAgZnVucyggDQojICAgICAgIG1pbiA9IA0KIyAgICAgICAgIG1pbiguLCANCiMgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgcTEgPSANCiMgICAgICAgICBxdWFudGlsZSguLCAwLjI1LCANCiMgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgICBtZWRpYW4gPSANCiMgICAgICAgICBtZWRpYW4oLiwgDQojICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgIG1lYW4gPSANCiMgICAgICAgICBtZWFuKC4sIA0KIyAgICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KIyAgICAgICBxMyA9IA0KIyAgICAgICAgIHF1YW50aWxlKC4sIDAuNzUsIA0KIyAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgIG1heCA9IA0KIyAgICAgICAgIG1heCguLCANCiMgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgbiA9IA0KIyAgICAgICAgIGxlbmd0aCguKQ0KIyAgICAgKQ0KIyAgICkgJT4lIA0KIyAgIHBpdm90X2xvbmdlcigNCiMgICAgICAgICFDT0RJR08sDQojICAgICAgICBuYW1lc190byA9ICJwYXJhbWV0cm8iLA0KIyAgICAgICAgdmFsdWVzX3RvID0gInZhbG9yIg0KIyAgICAgKSAlPiUgDQojICAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gQ09ESUdPLA0KIyAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSB2YWxvcikgJT4lIA0KIyAgIGdyb3VwX2J5KHBhcmFtZXRybykNCg0KDQoNCiMgcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KIyAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjIwMDAiICYNCiMgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAxMCIpDQojIA0KIyBwMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMjAxMCIgJg0KIyAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDIwIikNCg0KIyBwZXJpb2RvID0gYyhwMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjE5OTAiICYNCiMgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIiksDQojIA0KIyBwMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMjAwMCIgJg0KIyAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMTAiKSwNCiMgDQojIHAzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDEwIiAmDQojICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAyMCIpKQ0KDQojIHN1bWFyaW8gPC0gZnVuY3Rpb24ocGFyYW1ldHJvcyA9IHBhcmFtZXRyb3MsIHBlcmlvZG8pew0KIyAgIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICAgc2VsZWN0KENPRElHTywgLiwgQU5PX0NPTEVUQSkgJT4lIA0KIyAgICAjIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQojICAgICMgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSAlPiUgDQojICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KIyAgICBzdW1tYXJpemUoDQojICAgICAgbWluID0gDQojICAgICAgICBtaW4ocGFyYW1ldHJvcywgDQojICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICBxMSA9IA0KIyAgICAgICAgcXVhbnRpbGUocGFyYW1ldHJvcywgMC4yNSwgDQojICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgIG1lZGlhbiA9IA0KIyAgICAgICAgbWVkaWFuKHBhcmFtZXRyb3MsIA0KIyAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgbWVhbiA9IA0KIyAgICAgICAgbWVhbihwYXJhbWV0cm9zLCANCiMgICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KIyAgICAgIHEzID0gDQojICAgICAgICBxdWFudGlsZShwYXJhbWV0cm9zLCAwLjc1LCANCiMgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgbWF4ID0gDQojICAgICAgICBtYXgocGFyYW1ldHJvcywgDQojICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCiMgfQ0KDQojIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQojICAgc3VtYXJpbyhwYXJhbWV0cm9zID0gREJPKQ0KDQojIHN1bV9JUUFfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KIyAgICBkcGx5cjo6c2VsZWN0KENPRElHTywgSVFBLCBBTk9fQ09MRVRBKSAlPiUNCiMgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiMgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSAlPiUNCiMgICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUNCiMgICAgc3VtbWFyaXplKA0KIyAgICAgIG1pbiA9DQojICAgICAgICBtaW4oSVFBLA0KIyAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgcTEgPQ0KIyAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjI1LA0KIyAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICBtZWRpYW4gPQ0KIyAgICAgICAgbWVkaWFuKElRQSwNCiMgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgIG1lYW4gPQ0KIyAgICAgICAgbWVhbihJUUEsDQojICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiMgICAgICBxMyA9DQojICAgICAgICBxdWFudGlsZShJUUEsIDAuNzUsDQojICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgIG1heCA9DQojICAgICAgICBtYXgoSVFBLA0KIyAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQpgYGANCg0KIyBjcmlhbmRvIGZ1bsOnw6NvIHBhcmEgZ2VyYXIgYm94cGxvdHMgY29tIHBlcmNlbnRpbCAyMCBlIDgwDQpgYGB7ciBmdW5jYW8gcGVyY2VudGlsIDgwfQ0KZiA8LSBmdW5jdGlvbih4KSB7DQogIHIgPC0gcXVhbnRpbGUoeCwgcHJvYnMgPSBjKDAuMTAsIDAuMjAsIDAuNTAsIDAuODAsIDAuOTApKQ0KICBuYW1lcyhyKSA8LSBjKCJ5bWluIiwgImxvd2VyIiwgIm1pZGRsZSIsICJ1cHBlciIsICJ5bWF4IikNCiAgcmV0dXJuKHIpDQp9DQpgYGANCg0KIyBQYXLDom1ldHJvcyBmw61zaWNvLXF1w61taWNvcw0KDQojIyMgT3hpZ8OqbmlvIERpc3NvbHZpZG8NCg0KYGBge3IgR3LDoWZpY28gT0QgZmFjZXR0ZWQsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcuY2FwPSJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMjAifQ0KIyB5IDwtIHJub3JtKDEwMCkNCiMgZGYgPC0gZGF0YS5mcmFtZSgNCiMgICB4ID0gMSwNCiMgICB5MCA9IG1pbih5KSwNCiMgICB5MjUgPSBxdWFudGlsZSh5LCAwLjIwKSwNCiMgICB5NTAgPSBtZWRpYW4oeSksDQojICAgeTc1ID0gcXVhbnRpbGUoeSwgMC44MCksDQojICAgeTEwMCA9IG1heCh5KQ0KIyApDQojIGdncGxvdChkZiwgYWVzKHgpKSArDQojICAgZ2VvbV9ib3hwbG90KA0KIyAgICBhZXMoeW1pbiA9IHkwLCBsb3dlciA9IHkyNSwgbWlkZGxlID0geTUwLCB1cHBlciA9IHk3NSwgeW1heCA9IHkxMDApLA0KIyAgICBzdGF0ID0gImlkZW50aXR5Ig0KIyAgKQ0KDQojIA0KKG9kIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBnZ3Bsb3QoDQogICAgICBhZXMoDQogICAgICAgIHggPSBDT0RJR08sDQogICAgICAgIHkgPSBveGlnZW5pb19kaXNzb2x2aWRvLA0KICAgICAgICAjIGNvbG9yID0gcGVyaW9kbywNCiAgICAgICAgIyBmaWxsID0gcGVyaW9kbw0KICAgICAgICApDQogICAgKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICAgeW1pbiA9IC1JbmYsIHltYXggPSAyLA0KICAgICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgICBmaWxsID0gIiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluID0gLUluZiwgeG1heCA9IEluZiwNCiAgICAgICAgICAgICB5bWluID0gMiwgeW1heCA9IDQsDQogICAgICAgICAgICAgYWxwaGEgPSAxLA0KICAgICAgICAgICAgIGZpbGwgPSAiI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICAgeW1pbiA9IDQsIHltYXggPSA1LA0KICAgICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgICBmaWxsID0gIiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICAgIHltaW4gPSA1LCB5bWF4ID0gNiwNCiAgICAgICAgICAgICBhbHBoYSA9IDEsDQogICAgICAgICAgICAgZmlsbCA9ICIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluID0gLUluZiwgeG1heCA9IEluZiwNCiAgICAgICAgICAgICB5bWluPSA2LCB5bWF4ID0gSW5mLA0KICAgICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgICBmaWxsID0gIiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KA0KICAgICAgZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICB3aWR0aCA9IDAuMywNCiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgIGZ1bi5kYXRhID0gZiwNCiAgICApKw0KICAgIHN0YXRfYm94cGxvdCgNCiAgICAgIHdpZHRoID0gMC43LA0KICAgICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgIGdlb20gPSAiYm94cGxvdCIsDQogICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICApKw0KICAgICMgZ2VvbV9ib3hwbG90KA0KICAgICMgICAjIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgIyAgICMgY29sb3IgPSAiYmxhY2siLA0KICAgICAgIyBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAjICAgIyB3aWR0aCA9IDAuNw0KICAgICMgICBzdGF0ID0gImlkZW50aXR5Ig0KICAgICMgKSsNCiAgICMgc3RhdF9zdW1tYXJ5KA0KICAgIyAgIGZ1bi5kYXRhID0gbWVkaWFuX2hpbG93LA0KICAgIyAgIGZ1bi5hcmdzID0gMC42LA0KICAgIyAgIHNob3cubGVnZW5kID0gRkFMU0UsDQogICAjICAgZ2VvbSA9ICJjcm9zc2JhciIsDQogICAjICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICMgICBjb2xvciA9ICJibGFjayIsDQogICAjICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAjICAgd2lkdGggPSAwLjcNCiAgICMgICkrDQogICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICAgbGFicygNCiAgICAgIHRpdGxlID0gIk94aWfDqm5pbyBEaXNzb2x2aWRvIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsDQogICAgICB4PSBOVUxMLA0KICAgICAgeT0ibWcvTCINCiAgICApKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3lfY29udGludW91cygNCiAgICAgIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgIG4uYnJlYWtzID0gMTEsDQogICAgICBsaW1pdHMgPSBjKC0wLjMsMjEpDQogICAgKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikrDQogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGVyw61vZG8iLA0KICAgIGJyZWFrcyA9IGMoInAxIiwgInAyIiwgInAzIiksDQogICAgdmFsdWVzID0gYygiYmxhY2siLCAiIzMwMzAzMCIsICIjNjk2OTY5IiksDQogICAgbGFiZWxzID0gYygiMTk5MC0yMDAwIiwgIjIwMDAtMjAxMCIsICIyMDEwLTIwMjAiKQ0KICAgICkrDQogICAgZ2VvbV9zbW9vdGgoDQogICAgICBtZXRob2QgPSAibG0iLA0KICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICBhZXMoZ3JvdXAgPSAxKSwNCiAgICAgIGFscGhhID0gLjUsDQogICAgICBuYS5ybSA9IFRSVUUsDQogICAgICBzaXplID0gMQ0KICAgICkrDQogIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQoNCmBgYHtyIEdyw6FmaWNvIE9EIHBlcmlvZG8gMSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5jYXA9Ik94aWfDqm5pbyBEaXNzb2x2aWRvIG5vIHBlcsOtb2RvIDE5OTAtMjAwMCJ9DQoob2RfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIG94aWdlbmlvX2Rpc3NvbHZpZG8pDQopKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICB5bWluID0gLUluZiwgeW1heCA9IDIsDQogICAgICAgICAgICBhbHBoYSA9IDEsDQogICAgICAgICAgICBmaWxsID0gIiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICB5bWluID0gMiwgeW1heCA9IDQsDQogICAgICAgICAgICBhbHBoYSA9IDEsDQogICAgICAgICAgICBmaWxsID0gIiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluID0gLUluZiwgeG1heCA9IEluZiwNCiAgICAgICAgICAgIHltaW4gPSA0LCB5bWF4ID0gNSwNCiAgICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgIGZpbGwgPSAiI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICAgeW1pbiA9IDUsIHltYXggPSA2LA0KICAgICAgICAgICAgYWxwaGEgPSAxLA0KICAgICAgICAgICAgZmlsbCA9ICIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICB5bWluPSA2LCB5bWF4ID0gSW5mLA0KICAgICAgICAgICAgYWxwaGEgPSAxLA0KICAgICAgICAgICAgZmlsbCA9ICIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KA0KICAgICAgZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICB3aWR0aCA9IDAuMywNCiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KQ0KICAgKSsNCiAgIGdlb21fYm94cGxvdCgNCiAgICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgIHdpZHRoID0gMC43DQogICApKw0KICAgbGFicygNCiAgICAgIHRpdGxlID0gIk94aWfDqm5pbyBEaXNzb2x2aWRvIG5vIHBlcsOtb2RvIDE5OTAtMjAwMCIsDQogICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgeT0ibWcvTCINCiAgICkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgIGFscGhhID0gLjI1LA0KICAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgICAgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgbi5icmVha3MgPSAxMSwNCiAgICAgIGxpbWl0cyA9IGMoLTEsMjEpDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKA0KICAgICAgbWV0aG9kID0gImxtIiwNCiAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgYWVzKGdyb3VwID0gMSksDQogICAgICBhbHBoYSA9IC41LA0KICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgc2l6ZSA9IDENCiAgICkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KDQpgYGB7ciBHcsOhZmljbyBPRCBwZXJpb2RvIDIsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKG9kX3AyIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICBveGlnZW5pb19kaXNzb2x2aWRvKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICAgeW1heD0yLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTIsDQogICAgICAgICAgICAgeW1heD00LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NCwNCiAgICAgICAgICAgICB5bWF4PTUsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01LA0KICAgICAgICAgICAgIHltYXg9NiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTYsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiT3hpZ8OqbmlvIERpc3NvbHZpZG8gbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PU5VTEwpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3lfY29udGludW91cygNCiAgICAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgbi5icmVha3MgPSAxMSwNCiAgICAgICBsaW1pdHMgPSBjKC0xLDIxKSkrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKA0KICAgICAgIG1ldGhvZCA9ICJsbSIsDQogICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgIGFscGhhPS41LA0KICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICBzaXplID0gMQ0KICAgICkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCg0KYGBge3IgR3LDoWZpY28gT0QgcGVyaW9kbyAzLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihvZF9wMyA8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoQ09ESUdPKSwNCiAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICBveGlnZW5pb19kaXNzb2x2aWRvKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICAgeW1heD0yLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTIsDQogICAgICAgICAgICAgeW1heD00LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NCwNCiAgICAgICAgICAgICB5bWF4PTUsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01LA0KICAgICAgICAgICAgIHltYXg9NiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTYsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KA0KICAgICAjIGFlcygNCiAgICAgIyAgIHggPSBveGlnZW5pb19kaXNzb2x2aWRvLA0KICAgICAjICAgeW1pbiA9IG1pbihveGlnZW5pb19kaXNzb2x2aWRvKSwNCiAgICAgIyAgIGxvd2VyID0gcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC4zMCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIyAgIG1pZGRsZSA9IG1lZGlhbihveGlnZW5pb19kaXNzb2x2aWRvKSwNCiAgICAgIyAgIHVwcGVyID0gcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC44MCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIyAgIHltYXggPSBtYXgob3hpZ2VuaW9fZGlzc29sdmlkbykNCiAgICAgIyApLA0KICAgICAjIHN0YXQgPSAiaWRlbnRpdHkiLA0KICAgICBmaWxsPScjRjhGOEZGJywNCiAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgIHdpZHRoPSAwLjcNCiAgICkrDQogICBsYWJzKHRpdGxlID0gIk94aWfDqm5pbyBEaXNzb2x2aWRvIG5vIHBlcsOtb2RvIDIwMTAtMjAyMCIsDQogICAgICAgIHg9TlVMTCwNCiAgICAgICAgeT1OVUxMKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgICAgIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICBuLmJyZWFrcyA9IDExLA0KICAgICAgIGxpbWl0cyA9IGMoLTEsMjEpKSsNCiAgICBnZW9tX3Ntb290aCgNCiAgICAgICBtZXRob2QgPSAibG0iLA0KICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICBhbHBoYT0uNSwNCiAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgc2l6ZSA9IDENCiAgICApKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBPRCAzIHBlcmlvZG9zIGp1bnRvcywgZWNobyA9IFRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLmNhcD0iT3hpZ8OqbmlvIERpc3NvbHZpZG8gbm8gcGVyw61vZG8gMTk5MC0yMDIwIn0NCmdyaWQuYXJyYW5nZShvZF9wMSwgb2RfcDIsIG9kX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBPRCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCiMgZ2dzYXZlKCJvZC5wbmciLA0KIyAgICAgICAgdW5pdHMgPSBjKCJweCIpLA0KIyAgICAgICAgd2lkdGggPSA0NTAwLA0KIyAgICAgICAgaGVpZ2h0ID0gMjk5MywNCiMgICAgICAgIHBsb3QgPSBvZCwNCiMgICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQojICAgICAgICBkcGkgPSAzMDAsDQojICAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJvZF9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBvZF9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJvZF9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBvZF9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJvZF9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBvZF9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJvZF8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShvZF9wMSwgb2RfcDIsIG9kX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KYGBge3IgR3LDoWZpY28gT0RfY2hlcm5vYnlsLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgcDEgPC0gZnVuY3Rpb24ocGxhbl93aWRlXzE5OTAyMDIwLCBBTk9fQ09MRVRBKSB7DQojICAgcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiMgICAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjE5OTAiICYNCiMgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIikNCiMgfQ0KIyANCiMgDQojIGNsYXNzZXNfb2QgPC0gZnVuY3Rpb24ocGxhbl93aWRlXzE5OTAyMDIwLCBwYXJhbWV0cm8sIHBlcmlvZG8pew0KIyAgIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgICAgICAgICAgcGVyaW9kbyksDQojICAgYWVzKENPRElHTywNCiMgICAgICAgcGFyYW1ldHJvKQ0KIyB9DQoNCg0KIyAob2RfY2hlcm5vYnlsIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgcDEoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBveGlnZW5pb19kaXNzb2x2aWRvKSkrDQojICAgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgIHltaW49LUluZiwNCiMgICAgICAgICAgICAgIHltYXg9MiwNCiMgICAgICAgICAgICAgIGFscGhhPTEsDQojICAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiMgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgIHhtaW49LUluZiwNCiMgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgeW1pbj0yLA0KIyAgICAgICAgICAgICAgeW1heD00LA0KIyAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQojICAgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgIHltaW49NCwNCiMgICAgICAgICAgICAgIHltYXg9NSwNCiMgICAgICAgICAgICAgIGFscGhhPTEsDQojICAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KIyAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgeG1pbj0tSW5mLA0KIyAgICAgICAgICAgICAgeG1heD1JbmYsDQojICAgICAgICAgICAgICB5bWluPTUsDQojICAgICAgICAgICAgICB5bWF4PTYsDQojICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiMgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgIHhtaW49LUluZiwNCiMgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgeW1pbj02LA0KIyAgICAgICAgICAgICAgeW1heD1JbmYsDQojICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiMgICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiMgICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQojICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiMgICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiMgICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KIyAgICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KIyAgICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KIyAgICAgbGFicyh0aXRsZSA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KIyAgICAgICAgICB4PSJFc3Rhw6fDo28iLA0KIyAgICAgICAgICB5PSJtZy9MIikrDQojICAgICAjIGdlb21faml0dGVyKHdpZHRoID0gLjA3LA0KIyAgICAgIyAgICAgICAgICAgICBhbHBoYT0uMTUsDQojICAgICAjICAgICAgICAgICAgIHNpemU9MS4sDQojICAgICAjICAgICAgICAgICAgIGNvbG9yPSJibGFjayIpKw0KIyAgICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiMgICAgICAgc2l6ZSA9IDEuMiwNCiMgICAgICAgYWxwaGEgPSAuMjUsDQojICAgICAgIHdpZHRoID0gLjA3LA0KIyAgICAgKSsNCiMgICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQojICAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSAxMSwNCiMgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDIxKSkrDQojICAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQojICAgICApKw0KIyAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiMgICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KIyAgICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KIyAgICAgICAgICAgICAgICAgYWxwaGE9LjUsDQojICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQojICAgICAgICAgICAgICAgICBzaXplID0gMSkrDQojICAgICAjIGdlb21fbGluZSgNCiMgICAgICMgICBhZXMoY29sb3I9InJlZCIpLA0KIyAgICAgIyAgIGFscGhhPS4wKSsNCiMgICAgICMgc2NhbGVfY29sb3JfbWFudWFsKCJMZWdlbmRhIiwNCiMgICAgICMgICAgICAgICAgICAgICAgICAgIGd1aWRlPSJsZWdlbmQiLA0KIyAgICAgIyAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQ2xhc3NlIDEiPSIjOGRjZGViIiwNCiMgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSAyIj0iIzcwYzE4YyIsDQojICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzc2UgMyI9IiNmY2Y3YWIiLA0KIyAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xhc3NlIDQiPSIjZWI1NjYxIiwNCiMgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpb3IgQ2xhc3NlIj0iI2FjNTA3OSIpKSsNCiMgICAgICMgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxpbmV0eXBlPWMoMSwxLDEsMSwxKSwNCiMgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsd2Q9YygyLDIsMiwyLDIpLA0KIyAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlPWMoTkEsTkEsTkEsTkEsTkEpLA0KIyAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhPTEpKSkrDQojICAgdGhlbWUoDQojICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOSksDQojICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiMgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksDQojICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLA0KIyAgICkNCiMgKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBPRCBwZXJpb2RvMSwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KKGlxYW9kX3AxIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgSVFBX09ELCBuYS5ybSA9IFRSVUUpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgICB5bWF4PTE5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTE5LA0KICAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgICB5bWF4PTUxLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NTEsDQogICAgICAgICAgICAgeW1heD03OSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTc5LA0KICAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBwYXJhIG8gcGFyw6JtZXRybyBPeGlnw6puaW8gRGlzc29sdmlkbyAxOTkwLTIwMDAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9IiIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDYsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICAgZ2VvbV9zbW9vdGgoDQogICAgICAgbWV0aG9kID0gImxtIiwNCiAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgYWxwaGE9LjUsDQogICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgIHNpemUgPSAxDQogICAgKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIE9EIHBlcmlvZG8yLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooaXFhb2RfcDIgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICBJUUFfT0QsIG5hLnJtID0gVFJVRSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICAgeW1heD0zNiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTM2LA0KICAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgICBsYWJzKHRpdGxlID0gIlZhcmlhw6fDo28gZG8gSVFBIHBhcmEgbyBwYXLDom1ldHJvIE94aWfDqm5pbyBEaXNzb2x2aWRvIDIwMDAtMjAxMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iIikrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aCgNCiAgICAgICBtZXRob2QgPSAibG0iLA0KICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICBhbHBoYT0uNSwNCiAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgc2l6ZSA9IDENCiAgICApKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCg0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBPRCBwZXJpb2RvMywgZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooaXFhb2RfcDMgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICBJUUFfT0QsIG5hLnJtID0gVFJVRSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICAgeW1heD0zNiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTM2LA0KICAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgICBsYWJzKHRpdGxlID0gIlZhcmlhw6fDo28gZG8gSVFBIHBhcmEgbyBwYXLDom1ldHJvIE94aWfDqm5pbyBEaXNzb2x2aWRvIDIwMTAtMjAyMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iIikrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aCgNCiAgICAgICBtZXRob2QgPSAibG0iLA0KICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICBhbHBoYT0uNSwNCiAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgc2l6ZSA9IDENCiAgICApKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBPRF9JUUEgNiBwZXJpb2RvcyBqdW50b3MsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpncmlkLmFycmFuZ2UoaXFhb2RfcDEsIGlxYW9kX3AyLCBpcWFvZF9wMywgbmNvbCA9IDMpDQpgYGANCg0KYGBge3IgU3Vtw6FyaW8gT0QsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCihzdW1fb2RfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIG94aWdlbmlvX2Rpc3NvbHZpZG8sIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAwMCIpICU+JSANCiAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIyBDT0RJR08gPT0gIjg3Mzk4NTAwIiA8LSAidGVzdGUxIg0KICAgICMgJT4lIA0KIHN1bW1hcml6ZSgNCiAgICAgICBtYXggPSANCiAgICAgICAgICBtYXgob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm0gPSBUUlVFKSwNCiAgICAgICBxMyA9IA0KICAgICAgICAgIHF1YW50aWxlKG94aWdlbmlvX2Rpc3NvbHZpZG8sIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgICAgbWVkaWFuID0gDQogICAgICAgICAgbWVkaWFuKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQogICAgICAgbWVhbiA9IA0KICAgICAgICAgIG1lYW4ob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm09IFRSVUUpLA0KICAgICAgIHExID0gDQogICAgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICBtaW4gPSANCiAgICAgICAgICBtaW4ob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm0gPSBUUlVFKSwNCiAgICAgICBuID0gDQogICAgICAgICAgbGVuZ3RoKG94aWdlbmlvX2Rpc3NvbHZpZG8pDQogICAgKSAlPiUgDQogICAgcGl2b3RfbG9uZ2VyKA0KICAgICAgICFDT0RJR08sDQogICAgICAgbmFtZXNfdG8gPSAicGFyIiwNCiAgICAgICB2YWx1ZXNfdG8gPSAidmFsb3IiDQogICAgKSAlPiUgDQogICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IENPRElHTywNCiAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHZhbG9yKSAlPiUgDQogICByZW5hbWUoDQogICAgICJQTTEiID0gIjg3Mzk4NTAwIiwNCiAgICAgIlBNMiIgPSAiODczOTg5MDAiLA0KICAgICAiUE0zIiA9ICI4NzM5ODk1MCIsDQogICAgICJQTTQiID0gIjg3Mzk4OTgwIiwNCiAgICAgIlBNNSIgPSAiODc0MDU1MDAiLA0KICAgICAiUE02IiA9ICI4NzQwNjkwMCIsDQogICAgICJQTTciID0gIjg3NDA5OTAwIg0KICAgKSANCiApDQoNCiMgdGVzdGUxIDwtIHBhcmFtZXRyb3NfSVFBICU+JSANCiMgICBncm91cF9ieShDT0RJR08pICU+JSANCiMgICBwaXZvdF9sb25nZXIoDQojICAgICAhQ09ESUdPLA0KIyAgICAgbmFtZXNfdG8gPSAicGFyYW1ldHJvIiwNCiMgICAgIHZhbHVlc190byA9ICJ2YWxvciINCiMgICApICU+JSANCiMgICAjIGdyb3VwX2J5KHBhcmFtZXRybykNCiMgICBwaXZvdF93aWRlcigNCiMgICAgIG5hbWVzX2Zyb20gPSBDT0RJR08sDQojICAgICB2YWx1ZXNfZnJvbSA9IHZhbG9yLA0KIyAgICAgIyAuZ3JvdXBzID0gImRyb3AiDQojICAgKSAlPiUgDQojICAgcmVuYW1lKA0KIyAgICAgIlBNMSIgPSAiODczOTg1MDAiLA0KIyAgICAgIlBNMiIgPSAiODczOTg5MDAiLA0KIyAgICAgIlBNMyIgPSAiODczOTg5NTAiLA0KIyAgICAgIlBNNCIgPSAiODczOTg5ODAiLA0KIyAgICAgIlBNNSIgPSAiODc0MDU1MDAiLA0KIyAgICAgIlBNNiIgPSAiODc0MDY5MDAiLA0KIyAgICAgIlBNNyIgPSAiODc0MDk5MDAiDQojICAgKSAlPiUNCiMgICBzZWxlY3QocGFyLCBQTTEsIFBNMiwgUE0zLCBQTTQsIFBNNSwgUE02LCBQTTcpICU+JSANCiMgICBmaWx0ZXIoDQojICAgICBwYXIgPT0gInBIIg0KIyAgICkgDQojICU+JSANCiMgICB1bm5lc3QoZHBseXI6OmV2ZXJ5dGhpbmcoKSkNCg0KDQojIHRlc3RlMSRQTTFbMl0NCg0KIyAlPiUNCiMgICBzdW1tYXJpemUoDQojICAgICBtYXggPQ0KIyAgICAgICBtYXgob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm0gPSBUUlVFKSwNCiMgICAgIHEzID0NCiMgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC43NSwgbmEucm0gPSBUUlVFKSwNCiMgICAgIG1lZGlhbiA9DQojICAgICAgIG1lZGlhbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybSA9IFRSVUUpLA0KIyAgICAgbWVhbiA9DQojICAgICAgIG1lYW4ob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm09IFRSVUUpLA0KIyAgICAgcTEgPQ0KIyAgICAgICBxdWFudGlsZShveGlnZW5pb19kaXNzb2x2aWRvLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KIyAgICAgbWluID0NCiMgICAgICAgbWluKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQojICAgICBuID0NCiMgICAgICAgbGVuZ3RoKG94aWdlbmlvX2Rpc3NvbHZpZG8pDQojICAgICApDQojICMgICAgIA0KIyANCiMgc3VtKHN1bV9vZF9wMSRuKQ0KDQoNCg0KKHN1bV9vZF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgICBzZWxlY3QoQ09ESUdPLCBveGlnZW5pb19kaXNzb2x2aWRvLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgICBzdW1tYXJpemUoDQogICAgICAgICBtaW4gPSANCiAgICAgICAgICAgIG1pbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgcTEgPSANCiAgICAgICAgICAgIHF1YW50aWxlKG94aWdlbmlvX2Rpc3NvbHZpZG8sIDAuMjUsIG5hLnJtID0gVFJVRSksDQogICAgICAgICBtZWRpYW4gPSANCiAgICAgICAgICAgIG1lZGlhbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgbWVhbiA9IA0KICAgICAgICAgICAgbWVhbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybT0gVFJVRSksDQogICAgICAgICBxMyA9IA0KICAgICAgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC43NSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgIG1heCA9IA0KICAgICAgICAgICAgbWF4KG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSkNCiAgICAgICkNCikNCg0KKHN1bV9vZF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgICBzZWxlY3QoQ09ESUdPLCBveGlnZW5pb19kaXNzb2x2aWRvLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgICBzdW1tYXJpemUoDQogICAgICAgICBtaW4gPSANCiAgICAgICAgICAgIG1pbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgcTEgPSANCiAgICAgICAgICAgIHF1YW50aWxlKG94aWdlbmlvX2Rpc3NvbHZpZG8sIDAuMjUsIG5hLnJtID0gVFJVRSksDQogICAgICAgICBtZWRpYW4gPSANCiAgICAgICAgICAgIG1lZGlhbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgbWVhbiA9IA0KICAgICAgICAgICAgbWVhbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybT0gVFJVRSksDQogICAgICAgICBxMyA9IA0KICAgICAgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC43NSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgIG1heCA9IA0KICAgICAgICAgICAgbWF4KG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSkNCiAgICAgICkNCikNCg0KIyAgIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBDT0RJR08sDQojICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IENPRElHTywNCiMgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IG94aWdlbmlvX2Rpc3NvbHZpZG8pDQojIA0KIyANCiMgICBncm91cF9ieShDT0RJR08pICU+JQ0KIyAgIGdldF9zdW1tYXJ5X3N0YXRzKHR5cGUgPSAiY29tbW9uIikgJT4lDQojICAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IHZhcmlhYmxlLA0KIyAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBDT0RJR08sDQojICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSB2YXJpYWJsZSRveGlnZW5pb19kaXNzb2x2aWRvKQ0KIyANCiMgIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ3B1YnIiKQ0KIyAjIGxpYnJhcnkoZ2dwdWJyKQ0KYGBgDQoNCg0KIyMjIERlbWFuZGEgQmlvcXXDrW1pY2EgZGUgT3hpZ8OqbmlvDQoNCmBgYHtyIEdyw6FmaWNvIERCTyBmYWNldHRlZCwgZmlnLmNhcD0iRGVtYW5kYSBCaW9xdcOtbWljYSBkZSBPeGlnw6puaW8gbm8gcGVyw61vZG8gMTk5MC0yMDIwIn0NCihkYm8gPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgIHkgPSBEQk8pKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUsDQogICAgICAgICAgICB5bWF4PTEwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MywNCiAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICBsYWJzKHRpdGxlID0gIkRlbWFuZGEgQmlvcXXDrW1pY2EgZGUgT3hpZ8OqbmlvIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Im1nL0wiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLDEwMCksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIERCTyBwZXLDrW9kbzEsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooZGJvX3AxPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpLA0KICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgIERCTykpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xMCwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01LA0KICAgICAgICAgICAgIHltYXg9MTAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0zLA0KICAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgeW1heD0zLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgICBsYWJzKHRpdGxlID0gIkRlbWFuZGEgQmlvcXXDrW1pY2EgZGUgT3hpZ8OqbmlvIG5vIHBlcsOtb2RvIDE5OTAtMjAwMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0ibWcvTCIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIERCTyBwZXLDrW9kbzIsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooZGJvX3AyPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgIERCTykpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xMCwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01LA0KICAgICAgICAgICAgIHltYXg9MTAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MywNCiAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJEZW1hbmRhIEJpb3F1w61taWNhIGRlIE94aWfDqm5pbyBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJtZy9MIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIERCTyBwZXLDrW9kbzMsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooZGJvX3AzPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpLA0KICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgIERCTywgbmEucm09VFJVRSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xMCwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01LA0KICAgICAgICAgICAgIHltYXg9MTAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0zLA0KICAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgeW1heD0zLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgICBsYWJzKHRpdGxlID0gIkRlbWFuZGEgQmlvcXXDrW1pY2EgZGUgT3hpZ8OqbmlvIG5vIHBlcsOtb2RvIDIwMTAtMjAyMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0ibWcvTCIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMywwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLDEwMCksDQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIikrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgREJPIHBlcmlvZG8xLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGlxYV9kYm8xPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgSVFBX0RCTykpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTE5LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTE5LA0KICAgICAgICAgICAgeW1heD0zNiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTM2LA0KICAgICAgICAgICAgeW1heD01MSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUxLA0KICAgICAgICAgICAgeW1heD03OSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTc5LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDEpKQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBwYXJhIG8gcGFyw6JtZXRybyBEQk8gMTk5MC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBEQk8gcGVyaW9kbzIsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooaXFhX2RibzI8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAlPiUgDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgIElRQV9EQk8pKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgICB5bWF4PTE5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTE5LA0KICAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgICB5bWF4PTUxLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NTEsDQogICAgICAgICAgICAgeW1heD03OSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTc5LA0KICAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDEpKQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBwYXJhIG8gcGFyw6JtZXRybyBEQk8gMjAwMC0yMDEwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJtZy9MIikrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgREJPIHBlcmlvZG8zLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGlxYV9kYm8zPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpLA0KICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICBJUUFfREJPKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgICB5bWF4PTM2LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MzYsDQogICAgICAgICAgICAgeW1heD01MSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTUxLA0KICAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxKSkNCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgcGFyYSBvIHBhcsOibWV0cm8gREJPIDIwMTAtMjAyMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0ibWcvTCIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMSwxMDEpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIERCTyAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZShkYm9fcDEsIGRib19wMiwgZGJvX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBEQk8sIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQooc3VtX2Rib19wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoQ09ESUdPLCBEQk8sIEFOT19DT0xFVEEpICU+JSANCiAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpICU+JSANCiAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgc3VtbWFyaXplKA0KICAgICBtaW4gPSANCiAgICAgICBtaW4oREJPLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShEQk8sIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihEQk8sIA0KICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWFuID0gDQogICAgICAgbWVhbihEQk8sIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKERCTywgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KERCTywgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fZGJvX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBEQk8sIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oREJPLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShEQk8sIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihEQk8sIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihEQk8sIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKERCTywgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KERCTywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Rib19wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgREJPLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpICU+JSANCiAgICBncm91cF9ieShDT0RJR08pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKERCTywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoREJPLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oREJPLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oREJPLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShEQk8sIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChEQk8sIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBEQk8sIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQpnZ3NhdmUoImRiby5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZGJvLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImRib19wMS5wbmciLA0KICAgICAgIHBsb3QgPSBkYm9fcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiZGJvX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IGRib19wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJkYm9fcDMucG5nIiwNCiAgICAgICBwbG90ID0gZGJvX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImRib18zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShkYm9fcDEsIGRib19wMiwgZGJvX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIEbDs3Nmb3JvIHRvdGFsDQoNCmBgYHtyIEdyw6FmaWNvIGbDs3Nmb3JvIHRvdGFsIGZhY2V0dGVkLCBmaWcuY2FwPSJGw7NzZm9ybyB0b3RhbCBubyBwZXLDrW9kbyAxOTkwLTIwMjAifQ0KKHB0b3QgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICBmb3Nmb3JvX3RvdGFsKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MC4xNSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAuMSwNCiAgICAgICAgICAgIHltYXg9MC4xNSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTAuMSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogIGZhY2V0X3dyYXAofnBlcmlvZG8pKw0KICAgIGxhYnModGl0bGUgPSAiRsOzc2Zvcm8gdG90YWwgbm8gcGVyw61vZG8gMTk5MC0yMDIwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJtZy9MIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IC4wMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpDQogICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gRsOzc2Zvcm8gdG90YWwgcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHB0b3RfcDE8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIGZvc2Zvcm9fdG90YWwpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MC4xNSwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLjEsDQogICAgICAgICAgICAgeW1heD0wLjE1LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgICB5bWF4PTAuMSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJGw7NzZm9ybyB0b3RhbCBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIikrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KDQpgYGANCg0KYGBge3IgR3LDoWZpY28gRsOzc2Zvcm8gdG90YWwgcGVyaW9kbzIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHB0b3RfcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgIGZvc2Zvcm9fdG90YWwpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MC4xNSwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLjEsDQogICAgICAgICAgICAgeW1heD0wLjE1LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgICB5bWF4PTAuMSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJGw7NzZm9ybyB0b3RhbCBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMywwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsKSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCg0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIEbDs3Nmb3JvIHRvdGFsIHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihwdG90X3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICBmb3Nmb3JvX3RvdGFsKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAuMTUsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MC4xLA0KICAgICAgICAgICAgIHltYXg9MC4xNSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgeW1heD0wLjEsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiRsOzc2Zvcm8gdG90YWwgbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJtZy9MIikrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJGZvc2Zvcm9fdG90YWwpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQoNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBQdG90IDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKHB0b3RfcDEsIHB0b3RfcDIsIHB0b3RfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIEbDs3Nmb3JvIHRvdGFsLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KKHN1bV9wdG90X3AxIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBmb3Nmb3JvX3RvdGFsLCBBTk9fQ09MRVRBKSAlPiUgDQogICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShDT0RJR08pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKGZvc2Zvcm9fdG90YWwsIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUoZm9zZm9yb190b3RhbCwgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVkaWFuID0gDQogICAgICAgbWVkaWFuKGZvc2Zvcm9fdG90YWwsIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKGZvc2Zvcm9fdG90YWwsIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShmb3Nmb3JvX3RvdGFsLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgICBtYXggPSANCiAgICAgICBtYXgoZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSkpDQoNCihzdW1fcHRvdF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgZm9zZm9yb190b3RhbCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoZm9zZm9yb190b3RhbCwgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihmb3Nmb3JvX3RvdGFsLCBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShmb3Nmb3JvX3RvdGFsLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpKSkNCg0KKHN1bV9wdG90X3AzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBmb3Nmb3JvX3RvdGFsLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpICU+JSANCiAgICBncm91cF9ieShDT0RJR08pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKGZvc2Zvcm9fdG90YWwsIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShmb3Nmb3JvX3RvdGFsLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKGZvc2Zvcm9fdG90YWwsIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGZvc2Zvcm9fdG90YWwsIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGZvc2Zvcm9fdG90YWwsIG5hLnJtID0gVFJVRSkpKQ0KDQpgYGANCg0KYGBge3IgU2FsdmFuZG8gUHRvdCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCmdnc2F2ZSgicHRvdC5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gcHRvdCwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJwdG90X3AxLnBuZyIsDQogICAgICAgcGxvdCA9IHB0b3RfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicHRvdF9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBwdG90X3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInB0b3RfcDMucG5nIiwNCiAgICAgICBwbG90ID0gcHRvdF9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJwdG90XzNwZXJpb2Rvcy5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZ3JpZC5hcnJhbmdlKHB0b3RfcDEsIHB0b3RfcDIsIHB0b3RfcDMsIG5jb2wgPSAzKSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQojIyMgRXNjaGVyaWNoaWEgY29saQ0KDQpgYGB7ciBHcsOhZmljbyBFY29saSBmYWNldHRlZCwgZmlnLmNhcD0iRXNjaGVyaWNoaWEtY29saS1ncmF2YXRhw60gbm8gcGVyw61vZG8gMTk5MC0yMDIwIiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQplY29saV9fY2xhc3MgPC0gZnVuY3Rpb24oKSB7DQogIGxpc3QoYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICAgICB5bWluPTMyMDAsDQogICAgICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICAgICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgICAgICAgeW1pbj04MDAsDQogICAgICAgICAgICAgICAgICB5bWF4PTMyMDAsDQogICAgICAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICAgICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgICAgICAgeW1pbj0xNjAsDQogICAgICAgICAgICAgICAgICB5bWF4PTgwMCwNCiAgICAgICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgICAgICB5bWF4PTE2MCwNCiAgICAgICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikgI2NsYXNzZSAxDQogICkNCn0NCiAgDQooZWNvbGkgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIEVfY29saSkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTMyMDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj04MDAsDQogICAgICAgICAgICB5bWF4PTMyMDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xNjAsDQogICAgICAgICAgICB5bWF4PTgwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTE2MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBmYWNldF93cmFwKH5wZXJpb2RvKSsNCiAgIGxhYnModGl0bGUgPSAiRXNjaGVyaWNoaWEgY29saSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJOTVAvMTAwbUwiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICMgbi5icmVha3MgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkRV9jb2xpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRFX2NvbGksIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKSsNCiAgICB0aGVtZSgNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICAgICAgYW5nbGUgPSA5MCwgDQogICAgICAgICAgIyBzaXplPTE1LA0KICAgICAgICAgICMgZmFjZT0yDQogICAgICAgICkNCiAgICApDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gRWNvbGkgcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGVjb2xpX3AxIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgIEVfY29saSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0zMjAwLA0KICAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTgwMCwNCiAgICAgICAgICAgICB5bWF4PTMyMDAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xNjAsDQogICAgICAgICAgICAgeW1heD04MDAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgIHltYXg9MTYwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgICBsYWJzKHRpdGxlID0gIkVzY2hlcmljaGlhIGNvbGkgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJOTVAvMTAwbUwiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkRV9jb2xpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRFX2NvbGksIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIEVjb2xpIHBlcmlvZG8yLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihlY29saV9wMiA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgICBFX2NvbGkpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MzIwMCwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj04MDAsDQogICAgICAgICAgICAgeW1heD0zMjAwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTYwLA0KICAgICAgICAgICAgIHltYXg9ODAwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgICB5bWF4PTE2MCwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJFc2NoZXJpY2hpYSBjb2xpIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iTk1QLzEwMG1MIikrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjAxKSksDQogICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJEVfY29saSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJEVfY29saSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBFY29saSBwZXJpb2RvMywgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooZWNvbGlfcDMgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgRV9jb2xpKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTMyMDAsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49ODAwLA0KICAgICAgICAgICAgIHltYXg9MzIwMCwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTE2MCwNCiAgICAgICAgICAgICB5bWF4PTgwMCwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgeW1heD0xNjAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiRXNjaGVyaWNoaWEgY29saSBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Ik5NUC8xMDBtTCIpKw0KICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDksDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRFX2NvbGksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRFX2NvbGksIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIGVjb2xpIDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKGVjb2xpX3AxLCBlY29saV9wMiwgZWNvbGlfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIEVjb2xpLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KKHN1bV9lY29saV9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgRV9jb2xpLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShDT0RJR08pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKEVfY29saSwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUoRV9jb2xpLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oRV9jb2xpLCANCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oRV9jb2xpLCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShFX2NvbGksIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChFX2NvbGksIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Vjb2xpX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBFX2NvbGksIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oRV9jb2xpLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShFX2NvbGksIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihFX2NvbGksIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihFX2NvbGksIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKEVfY29saSwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KEVfY29saSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Vjb2xpX3AzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBFX2NvbGksIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oRV9jb2xpLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShFX2NvbGksIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihFX2NvbGksIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihFX2NvbGksIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKEVfY29saSwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KEVfY29saSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIGVjb2xpLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KZ2dzYXZlKCJlY29saS5wbmciLA0KICAgICAgIHBsb3QgPSBlY29saSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJlY29saV9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBlY29saV9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJlY29saV9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBlY29saV9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJlY29saV9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBlY29saV9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJlY29saV8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShlY29saV9wMSwgZWNvbGlfcDIsIGVjb2xpX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIE5pdHJvZ8OqbmlvIGFtb25pYWNhbA0KDQpgYGB7ciBHcsOhZmljbyBOaXRyb2fDqm5pbyB0b3RhbCBmYWNldHRlZCwgZmlnLmNhcD0ibml0cm9nZW5pby1ncmF2YXRhw60gbm8gcGVyw61vZG8gMTk5MC0yMDIwIiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoobmFtb24gPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIG5pdHJvX2Ftb24pKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMy4zLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49My43LA0KICAgICAgICAgICAgeW1heD0xMy4zLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9My43LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGZhY2V0X3dyYXAofnBlcmlvZG8pKw0KICAgbGFicyh0aXRsZSA9ICJOaXRyb2fDqm5pbyBhbW9uaWFjYWwgbm8gcGVyw61vZG8gMTk5MC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRuaXRyb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkbml0cm9fdG90YWwsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAuMDAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIE5pdHJvZ8OqbmlvIGxpbmUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KcGVyaW9kb19pbmljaWFsIDwtIGFzLkRhdGUoIjE5OTAtMDEtMDEiLCAiJVktJW0tJWQiKQ0KcGVyaW9kb19maW5hbCA8LSBhcy5EYXRlKCIyMDIxLTAxLTAxIiwgICIlWS0lbS0lZCIpDQoNCihuaXRyb19saW5lIDwtIA0KICAgIA0KICAgIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAyMCIpICU+JQ0KICAgIGRwbHlyOjpzZWxlY3QoQ09ESUdPLCBuaXRyb19hbW9uLCBEQVRBX0NPTEVUQSwgcGVyaW9kbykgJT4lDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUNCiAgICAjIHBpdm90X3dpZGVyKA0KICAgICMgICBuYW1lc19mcm9tID0gQ09ESUdPLA0KICAgICMgICB2YWx1ZXNfZnJvbSA9IG5pdHJvX2Ftb24sDQogICAgIyAgIGlkX2NvbHMgPSBEQVRBX0NPTEVUQQ0KICAgICMgKSAlPiUgDQogICAgZ2dwbG90KA0KICAgICAgYWVzKHggPSBEQVRBX0NPTEVUQSwNCiAgICAgICAgICB5ID0gbml0cm9fYW1vbiwNCiAgICAgICAgICAjIGNvbG9yID0gQ09ESUdPDQogICAgICApKSsNCiAgICAjIGdlb21fcmVjdCgNCiAgICAjICAgYWVzKHhtaW4gPSBwZXJpb2RvX2luaWNpYWwsIA0KICAgICMgICAgICAgeG1heCA9IHBlcmlvZG9fZmluYWwsDQogICAgIyAgICAgICB5bWluID0gMTMuMywgDQogICAgIyAgICAgICB5bWF4ID0gSW5mLA0KICAgICMgICAgICAgYWxwaGE9IDAuMDA1LA0KICAgICMgICAgICAgZmlsbD0gIiNhYzUwNzkiKSwNCiAgICAjIHNob3cubGVnZW5kID0gRkFMU0UpKyAjPnBpb3IgY2xhc3NlDQogICAgIyBnZW9tX3JlY3QoDQogICAgIyAgIGFlcyh4bWluID0gcGVyaW9kb19pbmljaWFsLCANCiAgICAjICAgICAgIHhtYXggPSBwZXJpb2RvX2ZpbmFsLA0KICAjICAgICAgIHltaW49IDMuNywNCiAgIyAgICAgICB5bWF4PSAxMy4zLA0KICAjICAgICAgIGFscGhhPSAwLjAwNSwNCiAgIyAgICAgICBmaWxsPSAiI2ZjZjdhYiIpLA0KICAjICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyAjY2xhc3NlIDMNCiAgIyBnZW9tX3JlY3QoDQogICMgICBhZXMoeG1pbiA9IHBlcmlvZG9faW5pY2lhbCwgDQogICMgICAgICAgeG1heCA9IHBlcmlvZG9fZmluYWwsDQogICMgICAgICAgeW1pbj0gMCwNCiAgIyAgICAgICB5bWF4PSAzLjcsDQogICMgICAgICAgYWxwaGE9IDAuMDA1LA0KICAjICAgICAgIGZpbGw9ICJibHVlIg0KICAjICAgICAgICAgIyAiIzhkY2RlYiINCiAgIyAgICAgICAgICksDQogICMgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrICNjbGFzc2UgMQ0KICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgIHhtaW49IHBlcmlvZG9faW5pY2lhbCwNCiAgICAgICAgICAgeG1heD0gcGVyaW9kb19maW5hbCwNCiAgICAgICAgICAgeW1pbj0xMy4zLA0KICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgYWxwaGE9IDAuNywNCiAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49IHBlcmlvZG9faW5pY2lhbCwNCiAgICAgICAgICAgICB4bWF4PSBwZXJpb2RvX2ZpbmFsLA0KICAgICAgICAgICAgIHltaW49My43LA0KICAgICAgICAgICAgIHltYXg9MTMuMywNCiAgICAgICAgICAgICBhbHBoYT0gMC43LA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49IHBlcmlvZG9faW5pY2lhbCwNCiAgICAgICAgICAgICB4bWF4PSBwZXJpb2RvX2ZpbmFsLA0KICAgICAgICAgICAgIHltaW49IC1JbmYsDQogICAgICAgICAgICAgeW1heD0zLjcsDQogICAgICAgICAgICAgYWxwaGE9IDAuNywNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIGdlb21fbGluZSgNCiAgICAgICMgYWVzKGNvbG9yID0gQ09ESUdPKSwNCiAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICMgYWVzKGNvbG9yID0gQ09ESUdPKSwNCiAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgc2NhbGVfeF9kYXRlKA0KICAgICAgbGltaXRzID0gYXMuRGF0ZShjKA0KICAgICAgICAiMTk5MC0wMS0wMSIsIA0KICAgICAgICAiMjAyMS0wMS0wMSINCiAgICAgICAgIyBOQSAjcG9kZSB1c2FyIE5BIHRhbWLDqW0NCiAgICAgICkpLA0KICAgICAgZXhwYW5kID0gYygwLjAsIDAuMCksDQogICAgICBkYXRlX2JyZWFrcyA9ICIxMCB5ZWFycyIsDQogICAgICBtaW5vcl9icmVha3MgPSAiNSB5ZWFycyIsDQogICAgICBkYXRlX2xhYmVscyA9ICIlWSIsDQogICAgKSsNCiAgICAjIGdlb21fc21vb3RoKA0KICAgICMgICAjIGFlcyhjb2xvciA9IENPRElHTyksDQogICAgIyAgIG1ldGhvZCA9ICJsbSIsDQogICAgIyAgICMgZm9ybXVsYSA9IHkgfiBwb2x5KHgsIDIpLA0KICAgICMgICAjIHNwYW4gPSAwLjIsDQogICAgIyAgIHNlID0gVFJVRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAjICAgYWVzKGdyb3VwID0gMSksDQogICAgIyAgIGFscGhhID0uNSwNCiAgICAjICAgbmEucm0gPSBUUlVFLA0KICAgICMgICBzaXplID0gMC4zLA0KICAgICMgICAjIGZ1bGxyYW5nZSA9IFRSVUUsDQogICMgICAjIHNob3cubGVnZW5kID0gVFJVRQ0KICAjICkrDQogICMgc3RhdF9zbW9vdGgoDQogICMgICBnZW9tID0gInNtb290aCIsDQogICMgICAjIHNwYW4gPSAwLjIsDQogICMgICBzZSA9IEZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAjICAgIyBhZXMoZ3JvdXAgPSAxKSwNCiAgIyAgICMgYWxwaGEgPS41LA0KICAjICAgbmEucm0gPSBUUlVFLA0KICAjICAgIyBzaXplID0gMC4zLA0KICAjICAgZnVsbHJhbmdlID0gVFJVRSwNCiAgIyAgIHNob3cubGVnZW5kID0gVFJVRQ0KICAjICkrDQogIGZhY2V0X3dyYXAoDQogICAgfkNPRElHTywNCiAgICBucm93ID0gNCwNCiAgKSsNCiAgICB0aGVtZV9idygpDQopDQpgYGANCg0KDQpgYGB7ciBHcsOhZmljbyBOaXRyb2fDqm5pbyB0b3RhbCBwZXJpb2RvMSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoobmFtb25fcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgbml0cm9fdG90YWwpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMy4zLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTMuNywNCiAgICAgICAgICAgICB5bWF4PTEzLjMsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgIHltYXg9My43LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiTml0cm9nw6puaW8gYW1vbmlhY2FsIG5vIHBlcsOtb2RvIDE5OTAtMjAwMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Im1nL0wiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkbml0cm9fdG90YWwsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJG5pdHJvX3RvdGFsLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gLjAwMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gTml0cm9nw6puaW8gdG90YWwgcGVyaW9kbzIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKG5hbW9uX3AyIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgIG5pdHJvX3RvdGFsKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTMuMywNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTMuNywNCiAgICAgICAgICAgIHltYXg9MTMuMywNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMuNywNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIk5pdHJvZ8OqbmlvIGFtb25pYWNhbCBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJtZy9MIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDksDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJG5pdHJvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRuaXRyb190b3RhbCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IC4wMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIE5pdHJvZ8OqbmlvIHRvdGFsIHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihuYW1vbl9wMyA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgICBuaXRyb190b3RhbCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEzLjMsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zLjcsDQogICAgICAgICAgICB5bWF4PTEzLjMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0zLjcsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJOaXRyb2fDqm5pbyBhbW9uaWFjYWwgbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRuaXRyb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkbml0cm9fdG90YWwsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAuMDAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBOYW1vbiAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZShuYW1vbl9wMSwgbmFtb25fcDIsIG5hbW9uX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBOaXRyb2fDqm5pbyB0b3RhbCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCihzdW1fbmFtb25fcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KENPRElHTywgbml0cm9fdG90YWwsIEFOT19DT0xFVEEpICU+JSANCiAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpICU+JSANCiAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgc3VtbWFyaXplKA0KICAgICBtaW4gPSANCiAgICAgICBtaW4obml0cm9fdG90YWwsIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBxMSA9IA0KICAgICAgIHF1YW50aWxlKG5pdHJvX3RvdGFsLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4obml0cm9fdG90YWwsIA0KICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWFuID0gDQogICAgICAgbWVhbihuaXRyb190b3RhbCwgDQogICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgIHEzID0gDQogICAgICAgcXVhbnRpbGUobml0cm9fdG90YWwsIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChuaXRyb190b3RhbCwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBuID0gDQogICAgICAgbGVuZ3RoKG5pdHJvX3RvdGFsKQ0KICAgKQ0KKQ0KDQooc3VtX25hbW9uX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBuaXRyb190b3RhbCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihuaXRyb190b3RhbCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUobml0cm9fdG90YWwsIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihuaXRyb190b3RhbCwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKG5pdHJvX3RvdGFsLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShuaXRyb190b3RhbCwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KG5pdHJvX3RvdGFsLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fbmFtb25fcDMgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIG5pdHJvX3RvdGFsLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpICU+JSANCiAgICBncm91cF9ieShDT0RJR08pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKG5pdHJvX3RvdGFsLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShuaXRyb190b3RhbCwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKG5pdHJvX3RvdGFsLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4obml0cm9fdG90YWwsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKG5pdHJvX3RvdGFsLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgobml0cm9fdG90YWwsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBuYW1vbiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCmdnc2F2ZSgibmFtb24ucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IG5hbW9uLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoIm5hbW9uX3AxLnBuZyIsDQogICAgICAgcGxvdCA9IG5hbW9uX3AxLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoIm5hbW9uX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IG5hbW9uX3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoIm5hbW9uX3AzLnBuZyIsDQogICAgICAgcGxvdCA9IG5hbW9uX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoIm5hbW9uXzNwZXJpb2Rvcy5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZ3JpZC5hcnJhbmdlKG5hbW9uX3AxLCBuYW1vbl9wMiwgbmFtb25fcDMsIG5jb2wgPSAzKSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQojIyMgVHVyYmlkZXoNCg0KYGBge3IgR3LDoWZpY28gVHVyYmlkZXogZmFjZXR0ZWQsIGZpZy5jYXA9InR1cmJpZGV6LWdyYXZhdGHDrSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCih0dXJiIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgdHVyYmlkZXopKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj00MCwNCiAgICAgICAgICAgIHltYXg9MTAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9NDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICBsYWJzKHRpdGxlID0gIlR1cmJpZGV6IG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IlVOVCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjA1LCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoDQogICAgICAgICAgICAgICAgICAgICAgICAjIDEsDQogICAgICAgICAgICAgICAgICAgICAgICBtaW4ocGxhbl93aWRlXzE5OTAyMDIwJHR1cmJpZGV6LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIyA1MDANCiAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkdHVyYmlkZXosIG5hLnJtID0gVFJVRSkNCiAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBUdXJiaWRleiBsaW5lLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCih0dXJiX2xpbmUgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQogICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMjAiKSAlPiUNCiAgc2VsZWN0KENPRElHTywgdHVyYmlkZXosIERBVEFfQ09MRVRBLCBwZXJpb2RvKSAlPiUNCiAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUNCiAgZ2dwbG90KA0KICAgIGFlcyh4ID0gREFUQV9DT0xFVEEsDQogICAgICAgIHkgPSB0dXJiaWRleiwNCiAgICAgICAgY29sb3IgPSBDT0RJR08NCiAgICApKSsNCiAgICBnZW9tX2xpbmUoDQogICAgICAjIGFlcyhjb2xvciA9IENPRElHTyksDQogICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIGdlb21fcG9pbnQoDQogICAgICAjIGFlcyhjb2xvciA9IENPRElHTyksDQogICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIHNjYWxlX3hfZGF0ZSgNCiAgICAgIGxpbWl0cyA9IGFzLkRhdGUoYygNCiAgICAgICAgIjE5OTAtMDEtMDEiLCANCiAgICAgICAgIjIwMjEtMDEtMDEiDQogICAgICAgICMgTkEgI3BvZGUgdXNhciBOQSB0YW1iw6ltDQogICAgICApKSwNCiAgICAgIGV4cGFuZCA9IGMoMC4wLCAwLjApLA0KICAgICAgZGF0ZV9icmVha3MgPSAiMTAgeWVhcnMiLA0KICAgICAgbWlub3JfYnJlYWtzID0gIjUgeWVhcnMiLA0KICAgICAgZGF0ZV9sYWJlbHMgPSAiJVkiLA0KICAgICkrDQogICMgZ2VvbV9zbW9vdGgoDQogICMgICAjIGFlcyhjb2xvciA9IENPRElHTyksDQogICMgICBtZXRob2QgPSAibG0iLA0KICAjICAgIyBmb3JtdWxhID0geSB+IHBvbHkoeCwgMiksDQogICMgICAjIHNwYW4gPSAwLjIsDQogICMgICBzZSA9IFRSVUUsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICMgICBhZXMoZ3JvdXAgPSAxKSwNCiAgIyAgIGFscGhhID0uNSwNCiAgIyAgIG5hLnJtID0gVFJVRSwNCiAgIyAgIHNpemUgPSAwLjMsDQogICMgICAjIGZ1bGxyYW5nZSA9IFRSVUUsDQogICMgICAjIHNob3cubGVnZW5kID0gVFJVRQ0KICAjICkrDQogICMgc3RhdF9zbW9vdGgoDQogICMgICBnZW9tID0gInNtb290aCIsDQogICMgICAjIHNwYW4gPSAwLjIsDQogICMgICBzZSA9IEZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAjICAgIyBhZXMoZ3JvdXAgPSAxKSwNCiAgIyAgICMgYWxwaGEgPS41LA0KICAjICAgbmEucm0gPSBUUlVFLA0KICAjICAgIyBzaXplID0gMC4zLA0KICAjICAgZnVsbHJhbmdlID0gVFJVRSwNCiAgIyAgIHNob3cubGVnZW5kID0gVFJVRQ0KICAjICkrDQogIGZhY2V0X3dyYXAoDQogICAgfkNPRElHTywNCiAgICBucm93ID0gNCwNCiAgKSsNCiAgdGhlbWVfYncoKQ0KKQ0KYGBgDQoNCg0KYGBge3IgR3LDoWZpY28gVHVyYmlkZXogcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHR1cmJfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICB0dXJiaWRleikpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEwMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTQwLA0KICAgICAgICAgICAgeW1heD0xMDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD00MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIlR1cmJpZGV6IG5vIHBlcsOtb2RvIDE5OTAtMjAwMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IlVOVCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjA1LCAwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCR0dXJiaWRleiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkdHVyYmlkZXosIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBUdXJiaWRleiBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoodHVyYl9wMiA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgIHR1cmJpZGV6KSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NDAsDQogICAgICAgICAgICB5bWF4PTEwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTQwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiVHVyYmlkZXogbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iVU5UIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDUsIDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJHR1cmJpZGV6LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCR0dXJiaWRleiwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFR1cmJpZGV6IHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCih0dXJiX3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgdHVyYmlkZXopKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj00MCwNCiAgICAgICAgICAgIHltYXg9MTAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9NDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJUdXJiaWRleiBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJVTlQiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wNSwgMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkdHVyYmlkZXosIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJHR1cmJpZGV6LCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gdHVyYiAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZSh0dXJiX3AxLCB0dXJiX3AyLCB0dXJiX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBUdXJiaWRleiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCihzdW1fdHVyYl9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoQ09ESUdPLCB0dXJiaWRleiwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbih0dXJiaWRleiwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUodHVyYmlkZXosIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbih0dXJiaWRleiwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKHR1cmJpZGV6LCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZSh0dXJiaWRleiwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KHR1cmJpZGV6LCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV90dXJiX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCB0dXJiaWRleiwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbih0dXJiaWRleiwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUodHVyYmlkZXosIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbih0dXJiaWRleiwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKHR1cmJpZGV6LCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZSh0dXJiaWRleiwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KHR1cmJpZGV6LCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fdHVyYl9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgdHVyYmlkZXosIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4odHVyYmlkZXosIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHR1cmJpZGV6LCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4odHVyYmlkZXosIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbih0dXJiaWRleiwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUodHVyYmlkZXosIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heCh0dXJiaWRleiwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKSANCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyB0dXJiLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KZ2dzYXZlKCJ0dXJiLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSB0dXJiLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInR1cmJfcDEucG5nIiwNCiAgICAgICBwbG90ID0gdHVyYl9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJ0dXJiX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IHR1cmJfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgidHVyYl9wMy5wbmciLA0KICAgICAgIHBsb3QgPSB0dXJiX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInR1cmJfM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UodHVyYl9wMSwgdHVyYl9wMiwgdHVyYl9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIyBwSA0KDQpgYGB7ciBHcsOhZmljbyBwSCBmYWNldHRlZCwgZmlnLmNhcD0icEgtZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHBIIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICBwSCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj05LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj02LA0KICAgICAgICAgICAgeW1heD05LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGZhY2V0X3dyYXAofnBlcmlvZG8pKw0KICAgbGFicyh0aXRsZSA9ICJwSCBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDQsMTEpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIHBIIHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihwSF9wMSA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIiksDQogICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICBwSCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj05LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj02LA0KICAgICAgICAgICAgeW1heD05LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAicEggbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg0LDExKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBwSCBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoocEhfcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgcEgpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD02LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NiwNCiAgICAgICAgICAgIHltYXg9OSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gInBIIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IiIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjAxKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoNCwxMSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gcEggcGVyaW9kbzMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHBIX3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIHBIKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9NiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTksDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTYsDQogICAgICAgICAgICB5bWF4PTksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJwSCBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDQsMTEpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIHBIIDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKHBIX3AxLCBwSF9wMiwgcEhfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIHBILCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KKHN1bV9wSF9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoQ09ESUdPLCBwSCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihwSCwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUocEgsIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihwSCwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKHBILCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShwSCwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KHBILCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9wSF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgcEgsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4ocEgsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHBILCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4ocEgsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihwSCwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUocEgsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChwSCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKSANCg0KKHN1bV9wSF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgcEgsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4ocEgsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHBILCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4ocEgsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihwSCwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUocEgsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChwSCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIHBILCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KZ2dzYXZlKCJwSC5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gcEgsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfcDEucG5nIiwNCiAgICAgICBwbG90ID0gcEhfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfcDIucG5nIiwNCiAgICAgICBwbG90ID0gcEhfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfcDMucG5nIiwNCiAgICAgICBwbG90ID0gcEhfcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UocEhfcDEsIHBIX3AyLCBwSF9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIyBTw7NsaWRvcyB0b3RhaXMNCg0KYGBge3IgR3LDoWZpY28gU8OzbFRvdCBmYWNldHRlZCwgZmlnLmNhcD0ic8OzbGlkb3MtdG90YWlzLWdyYXZhdGHDrSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihTb2xUb3QgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgc29saWRvc190b3RhaXMpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICAgeW1pbiA9IDUwMCwgeW1heCA9IEluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICBsYWJzKHRpdGxlID0gIlPDs2xpZG9zIHRvdGFpcyBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJHNvbGlkb3NfdG90YWlzLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFPDs2xUb3QgcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKFNvbFRvdF9wMSA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgICAgc29saWRvc190b3RhaXMpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICAgeW1pbiA9IDUwMCwgeW1heCA9IEluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJTw7NsaWRvcyB0b3RhaXMgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRzb2xpZG9zX3RvdGFpcywgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gU8OzbFRvdCBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooU29sVG90X3AyIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzb2xpZG9zX3RvdGFpcykpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICB5bWluID0gNTAwLCB5bWF4ID0gSW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIlPDs2xpZG9zIHRvdGFpcyBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJHNvbGlkb3NfdG90YWlzLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFPDs2xUb3QgcGVyaW9kbzMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKFNvbFRvdF9wMyA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgICAgc29saWRvc190b3RhaXMpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluID0gLUluZiwgeG1heCA9IEluZiwNCiAgICAgICAgICAgIHltaW4gPSA1MDAsIHltYXggPSBJbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiU8OzbGlkb3MgdG90YWlzIG5vIHBlcsOtb2RvIDIwMTAtMjAyMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRzb2xpZG9zX3RvdGFpcywgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBTw7NsVG90IDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKFNvbFRvdF9wMSwgU29sVG90X3AyLCBTb2xUb3RfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIFPDs2xpZG9zIFRvdGFpcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCihzdW1fU29sVG90X3AxIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgIHNlbGVjdChDT0RJR08sIHNvbGlkb3NfdG90YWlzLCBBTk9fQ09MRVRBKSAlPiUgDQogICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShDT0RJR08pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKHNvbGlkb3NfdG90YWlzLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShzb2xpZG9zX3RvdGFpcywgMC4yNSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVkaWFuID0gDQogICAgICAgbWVkaWFuKHNvbGlkb3NfdG90YWlzLCANCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKHNvbGlkb3NfdG90YWlzLCAwLjc1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtYXggPSANCiAgICAgICBtYXgoc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX1NvbFRvdF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgc29saWRvc190b3RhaXMsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHNvbGlkb3NfdG90YWlzLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoc29saWRvc190b3RhaXMsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX1NvbFRvdF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgc29saWRvc190b3RhaXMsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHNvbGlkb3NfdG90YWlzLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoc29saWRvc190b3RhaXMsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIFNvbFRvdCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCmdnc2F2ZSgiU29sVG90LnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBTb2xUb3QsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiU29sVG90X3AxLnBuZyIsDQogICAgICAgcGxvdCA9IFNvbFRvdF9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJTb2xUb3RfcDIucG5nIiwNCiAgICAgICBwbG90ID0gU29sVG90X3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoIlNvbFRvdF9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBTb2xUb3RfcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiU29sVG90XzNwZXJpb2Rvcy5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZ3JpZC5hcnJhbmdlKFNvbFRvdF9wMSwgU29sVG90X3AyLCBTb2xUb3RfcDMsIG5jb2wgPSAzKSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQojIyMgSVFBDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBmYWNldHRlZCwgZmlnLmNhcD0iaXFhLWdyYXZhdGHDrSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQooaXFhIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgIElRQSwgbmEucm0gPSBUUlVFKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MjUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MjUsDQogICAgICAgICAgICB5bWF4PTUwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAsDQogICAgICAgICAgICB5bWF4PTcwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NzAsDQogICAgICAgICAgICB5bWF4PTkwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49OTAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGZhY2V0X3dyYXAofnBlcmlvZG8pKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJJUUEiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KICAgIyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIHBlcmlvZG8xLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQooaXFhX3AxIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIElRQSwgbmEucm0gPSBUUlVFKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTI1LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTI1LA0KICAgICAgICAgICAgeW1heD01MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUwLA0KICAgICAgICAgICAgeW1heD03MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTcwLA0KICAgICAgICAgICAgeW1heD05MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTkwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9IiIpKw0KICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMSwxMDEpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKSsNCiAgIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgcGVyaW9kbzIsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCihpcWFfcDIgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAxMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgSVFBLCBuYS5ybSA9IFRSVUUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0yNSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0yNSwNCiAgICAgICAgICAgIHltYXg9NTAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MCwNCiAgICAgICAgICAgIHltYXg9NzAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03MCwNCiAgICAgICAgICAgIHltYXg9OTAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj05MCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIHRoZW1lX2dyYWZzKCkrDQogICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgICkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgcGVyaW9kbzMsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCihpcWFfcDMgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAyMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgSVFBLCBuYS5ybSA9IFRSVUUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0yNSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0yNSwNCiAgICAgICAgICAgIHltYXg9NTAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MCwNCiAgICAgICAgICAgIHltYXg9NzAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03MCwNCiAgICAgICAgICAgIHltYXg9OTAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj05MCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkrDQogICAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIElRQSAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZShpcWFfcDEsIGlxYV9wMiwgaXFhX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBJUUEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQooc3VtX0lRQV9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoQ09ESUdPLCBJUUEsIEFOT19DT0xFVEEpICU+JSANCiAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpICU+JSANCiAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgc3VtbWFyaXplKA0KICAgICBtaW4gPSANCiAgICAgICBtaW4oSVFBLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShJUUEsIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihJUUEsIA0KICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWFuID0gDQogICAgICAgbWVhbihJUUEsIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKElRQSwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KElRQSwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG4gPSANCiAgICAgICAgbGVuZ3RoKElRQSkNCiAgICkNCikNCg0KKHN1bV9JUUFfcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIElRQSwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihJUUEsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKElRQSwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKElRQSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKElRQSwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoSVFBLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBuID0gDQogICAgICAgIGxlbmd0aChJUUEpDQogICAgICApDQopDQoNCihzdW1fSVFBX3AzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBJUUEsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lDQogICAgIyA/YXNfZmFjdG9yKENPRElHTykgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihJUUEsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKElRQSwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKElRQSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKElRQSwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoSVFBLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBuID0gDQogICAgICAgIGxlbmd0aChJUUEpLA0KICAgICAgTkFzID0gDQogICAgICAgIHN1bShpcy5uYShJUUEpKQ0KICAgICAgKSAlPiUgDQogIG11dGF0ZSgNCiAgICAiJU5BIiA9IE5Bcy9uKjEwMA0KICApDQopDQoNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBpcWEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQpnZ3NhdmUoImlxYS5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gaXFhLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImlxYV9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBpcWFfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiaXFhX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IGlxYV9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJpcWFfcDMucG5nIiwNCiAgICAgICBwbG90ID0gaXFhX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImlxYV8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShpcWFfcDEsIGlxYV9wMiwgaXFhX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMgVGVzdGFuZG8gY29pc2FzDQoNCmBgYHtyIFRlc3RhbmRvIGNvaXNhcywgaW5jbHVkZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KIyBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgICBzZWxlY3QoQ09ESUdPLCBveGlnZW5pb19kaXNzb2x2aWRvLCBBTk9fQ09MRVRBKSAlPiUgDQojICAgIGdncGxvdChhZXMoQU5PX0NPTEVUQSwgb3hpZ2VuaW9fZGlzc29sdmlkbywgDQojICAgICAgIGNvbCA9IENPRElHTykpKw0KIyAgICBnZW9tX2xpbmUoKSsNCiMgICAgZmFjZXRfd3JhcCh+IENPRElHTywgbmNvbCA9IDcpDQoNCiMgZGYxMTEgPC0gZGF0YS5mcmFtZSh4ID0gYygxOjEwMCkpDQojIGdsaW1wc2UoZGYxMTEpDQojIGRmMTExJHkgPC0gMiArIDMgKiBkZjExMSR4ICsgcm5vcm0oMTAwLCBzZCA9IDQwKQ0KIyANCiMgbG1fZXFuIDwtIGZ1bmN0aW9uKGRmMTExKXsNCiMgICAgIG0gPC0gbG0oeSB+IHgsIGRmMTExKTsNCiMgICAgIGVxIDwtIHN1YnN0aXR1dGUoeSA9PSBhICsgYiAlLiUgeCoiLCJ+fnJeMn4iPSJ+cjIsDQojICAgICAgICAgIGxpc3QoYSA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsxXSksIGRpZ2l0cyA9IDIpLA0KIyAgICAgICAgICAgICAgIGIgPSBmb3JtYXQodW5uYW1lKGNvZWYobSlbMl0pLCBkaWdpdHMgPSAyKSwNCiMgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQojICAgICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihlcSkpOw0KIyB9IA0KIyBwMiA8LSBwMTExICsNCiMgICBnZW9tX3RleHQoeCA9IDI1LCB5ID0gMzAwLA0KIyAgICAgICAgICAgICBsYWJlbCA9IGxtX2VxbihkZjExMSksDQojICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkNCiMgcDINCiMgDQojIA0KIyBsbV9lcWMgPC0gZnVuY3Rpb24ocGxhbl93aWRlXzE5OTAyMDIwKXsNCiMgICAgbSA8LSBsbShveGlnZW5pb19kaXNzb2x2aWRvIH4gQ09ESUdPLCBwbGFuX3dpZGVfMTk5MDIwMjApOw0KIyAgICBlcSA8LSBzdWJzdGl0dXRlKHkgPT0gYSArIGIgJS4lIHgqIiwifn5yXjJ+Ij0ifnIyLA0KIyAgICAgICAgICAgICAgICAgICAgIGxpc3QoYSA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsxXSksIGRpZ2l0cyA9IDIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsyXSksIGRpZ2l0cyA9IDIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiMgICAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsNCiMgfQ0KIyANCiMgKG9kX3AxIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiMgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQojICAgICAgICAgICAgICAgICAgICAgb3hpZ2VuaW9fZGlzc29sdmlkbykpKw0KIyAgICAgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgICAgIHhtaW49LUluZiwNCiMgICAgICAgICAgICAgICAgeG1heD1JbmYsDQojICAgICAgICAgICAgICAgIHltaW49LUluZiwNCiMgICAgICAgICAgICAgICAgeW1heD0yLA0KIyAgICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTIsDQojICAgICAgICAgICAgICAgIHltYXg9NCwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTQsDQojICAgICAgICAgICAgICAgIHltYXg9NSwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTUsDQojICAgICAgICAgICAgICAgIHltYXg9NiwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTYsDQojICAgICAgICAgICAgICAgIHltYXg9SW5mLA0KIyAgICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KIyAgICAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQojICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQojICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KIyAgICAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQojICAgICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KIyAgICAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQojICAgICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiMgICAgICAgbGFicyh0aXRsZSA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KIyAgICAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQojICAgICAgICAgICAgeT0ibWcvTCIpKw0KIyAgICAgICAjIGdlb21faml0dGVyKHdpZHRoID0gLjA1LA0KIyAgICAgICAjICAgICAgICAgICAgIGFscGhhPS4yLA0KIyAgICAgICAjICAgICAgICAgICAgIHNpemU9MS41LA0KIyAgICAgICAjICAgICAgICAgICAgIGNvbG9yPSJibGFjayIpKw0KIyAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSAxMSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMjEpKSsNCiMgICAgICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiMgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiMgICAgICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQojICAgICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiMgICAgICAgICAgICAgICAgICAgYWxwaGE9LjUsDQojICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiMgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIyAgICAgICAjIGFubm90YXRlKGdlb21fdGV4dChhZXMoeCA9ICI4NzQwNTUwMCIsIHkgPSAxNSksDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbG1fZXFjKHBsYW5fd2lkZV8xOTkwMjAyMCksDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSwNCiMgICAgICAgIyAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBUUlVFLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICBjaGVja19vdmVybGFwID0gVFJVRSkpKw0KIyAgICAgICAjICBnZW9tX2xpbmUoDQojICAgICAgICMgICAgIGFlcyhjb2xvcj0icmVkIiksDQojICAgICAgICMgICAgIGFscGhhPS4wLA0KIyAgICAgICAjICkrDQojICAgICAgICMgc2NhbGVfY29sb3JfbWFudWFsKCJMZWdlbmRhIiwNCiMgICAgICAgIyAgICAgICAgICAgICAgICAgICAgZ3VpZGU9ImxlZ2VuZCIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkNsYXNzZSAxIj0iIzhkY2RlYiIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSAyIj0iIzcwYzE4YyIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSAzIj0iI2ZjZjdhYiIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSA0Ij0iI2ViNTY2MSIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpb3IgQ2xhc3NlIj0iI2FjNTA3OSIpKSsNCiMgICAgIyBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGluZXR5cGU9YygxLDEsMSwxLDEpLA0KIyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsd2Q9YygyLDIsMiwyLDIpLA0KIyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZT1jKE5BLE5BLE5BLE5BLE5BKSwNCiMgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE9MSkpKSsNCiMgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgICAgICB0aGVtZV9jbGFzc2ljKCkpDQoNCiMgbGlzdDExMTEgPC0gc2Vzc2lvbkluZm8oKQ0KIyBsaXN0MTExMSRsb2FkZWRPbmx5DQoNCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbWlzYyIpDQojIGxpYnJhcnkoZ2dwbWlzYykNCg0KIyBzdW1tYXJ5KGxtKHBsYW5fd2lkZV8xOTkwMjAyMCRDT0RJR09+cGxhbl93aWRlXzE5OTAyMDIwJERCTykpDQojIA0KIyANCiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHk9bnVtYmVyLCB4PXBvZCkpICsNCiMgICBnZW9tX2JveHBsb3QoKQ0KIyBwcmludChwKQ0KDQojIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQoNCg0KIyBmaXQgPSBsbShwbGFuX3dpZGVfMTk5MDIwMjAkb3hpZ2VuaW9fZGlzc29sdmlkb34gcGxhbl93aWRlXzE5OTAyMDIwJENPRElHTykNCiMgc3VtbWFyeShmaXQpDQojIHN1bW1hcnkubG0oZml0KQ0KIyANCiMgcGFjbWFuOjpwX2xvYWQoZXNxdWlzc2UpDQoNCiMgc3VtYXJpbyA8LSBmdW5jdGlvbih4LCB5KXsNCiMgICB4ICU+JSANCiMgICAgIGdyb3VwX2J5KENPRElHTykgJT4lDQojICAgICBzdW1tYXJpc2UoDQojICAgICAgIGxpc3QobWluPSB+bWluKHksIG5hLnJtID0gVFJVRSksIA0KIyAgICAgICAgICAgIFExPSB+cXVhbnRpbGUoeSwgcHJvYnMgPSAwLjI1KSwNCiMgICAgICAgICAgICBtZWRpYW49IH5tZWRpYW4oeSwgbmEucm0gPSBUUlVFKSwgDQojICAgICAgICAgICAgUTM9IH5xdWFudGlsZSh5LCBwcm9icyA9IDAuNzUpLA0KIyAgICAgICAgICAgIG1heD0gfm1heCh5LCBuYS5ybSA9IFRSVUUpKSwNCiMgICAgICAgLmdyb3VwcyA9ICJkcm9wIg0KIyAgICAgICApDQojIH0NCmBgYA0KDQojIyMgQ29ycmVsYcOnw6NvDQoNCmBgYHtyIENvcnJlbGHDp8OjbywgZmlnLmNhcD0iY29ycmVsYcOnw6NvLXBhcmFtZXRyb3MtcXVhbGlkYWRlLWFndWEtZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHRpbWVfaXQgPSBUUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KcGFyYW1ldHJvc19JUUEgJT4lIA0KICBkcGx5cjo6c2VsZWN0KA0KICAgIC1DT0RJR08sDQogICAgLW5pdHJvX3RvdGFsKSAlPiUgDQogICMgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogIHJlbmFtZSgNCiAgICBDRSA9IENvbmR1dGl2aWRhZGUsDQogICAgT0QgPSBveGlnZW5pb19kaXNzb2x2aWRvLA0KICAgIFNUID0gc29saWRvc190b3RhaXMsDQogICAgVHVyYiA9IHR1cmJpZGV6LA0KICAgIFRlbXAgPSB0ZW1wX2FndWEsDQogICAgUHRvdCA9IGZvc2Zvcm9fdG90YWwsDQogICAgTkFtb24gPSBuaXRyb19hbW9uLA0KICAgIE5USyA9IG5pdHJvX2tqZWxkYWhsDQogICkgJT4lIA0KICBnZ2NvcnIoDQogICAgbWV0aG9kID0gImNvbXBsZXRlLm9icyIsDQogICAgIyAicGVhcnNvbiIsDQogICAgIyAicGFpcndpc2UiLA0KICAgIG5hbWUgPSAiQ29ycmVsYcOnw6NvIiwNCiAgICBsYWJlbCA9IFRSVUUsDQogICAgbGFiZWxfYWxwaGEgPSBUUlVFLA0KICAgIGRpZ2l0cyA9IDMsDQogICAgbG93ID0gIiMzQjlBQjIiLA0KICAgIG1pZCA9ICIjRUVFRUVFIiwNCiAgICBoaWdoID0gIiNGMjFBMDAiLA0KICAgICMgcGFsZXR0ZSA9ICJSZFlsQnUiLA0KICAgIGxheW91dC5leHAgPSAwLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IiwNCiAgICBsYWJlbF9yb3VuZCA9IDMsDQogICAgIyBsZWdlbmQuc2l6ZSA9IDE4LA0KICAgIGdlb20gPSAidGlsZSIsDQogICAgbmJyZWFrcyA9IDEwLA0KICApKw0KICBsYWJzKHRpdGxlID0gIkNvcnJlbGHDp8OjbyBlbnRyZSBwYXLDom1ldHJvcyBmw61zaWNvLXF1w61taWNvcyBuYVxuQmFjaWEgSGlkcm9ncsOhZmljYSBkbyByaW8gR3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIpKw0KICB0aGVtZV9saW5lZHJhdygpKw0KICB0aGVtZSgNCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuMTUsIDAuNiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAjIGxlZ2VuZC5zcGFjaW5nID0gdW5pdChlbGVtZW50X3RleHQoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bml0cyA9IDUpDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxNikNCiAgKQ0KDQojIEdyw6FmaWNvIGRhcyBjb3JyZWxhw6fDtWVzIGVudHJlIHRvZG9zIG9zIHBhcsOibWV0cm9zIGNvbSBzaWduaWZpY8OibmNpYQ0KY29ycmVsX0lRQSA8LSBwYXJhbWV0cm9zX0lRQSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtQ09ESUdPKSAlPiUNCiAgZ2dwYWlycyh0aXRsZSA9ICJDb3JyZWxhw6fDo28gZW50cmUgcGFyw6JtZXRyb3MgcXVlIGNvbXDDtWVtIG8gSVFBIiwNCiAgICAgICAgICBheGlzTGFiZWxzID0gInNob3ciKQ0KDQpjb3JyZWxhY2FvX3BJUUEgPC0gcGFyYW1ldHJvc19JUUEgJT4lIA0KICBncm91cF9ieShDT0RJR08pICU+JSANCiAgY29ycmVsYXRpb246OmNvcnJlbGF0aW9uKCkNCg0KY29ycmVsYWNhb19wSVFBICU+JSANCiAgIyBnbGltcHNlKCkNCiAgZmlsdGVyKA0KICAgIHAgPCAwLjAwMQ0KICApICU+JSANCiAgdCgpICU+JSANCiAgc3VtbWFyeSgpDQoNCnBhcmFtZXRyb3NfSVFBICU+JSANCiAgIyBncm91cF9ieShDT0RJR08pICU+JSANCiAgZHBseXI6OnNlbGVjdCgNCiAgICBuaXRyb19ramVsZGFobCwgQ29uZHV0aXZpZGFkZQ0KICApICU+JSANCiAgIyBjb3JyZWxhdGlvbjo6Y29yX3Rlc3QoKSAlPiUgDQogIHBsb3QoKQ0KDQpzdHIoDQogIHBsb3QoDQogICAgY29ycmVsYXRpb246OmNvcl90ZXN0KA0KICAgICAgcGFyYW1ldHJvc19JUUEsDQogICAgICAibml0cm9fa2plbGRhaGwiLA0KICAgICAgIkNvbmR1dGl2aWRhZGUiDQogICAgKQ0KICApDQopDQpgYGANCg0KIyMjIENvbmR1dGl2aWRhZGUgZWzDqXRyaWNhDQpgYGB7ciBHcsOhZmljbyBjb25kX2VsZXQgZmFjZXR0ZWQsIGZpZy5jYXA9ImNvbmR1dGl2aWRhZGUtZWxldHJpY2EtZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGNvbmRfZWxldCA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kdXRpdmlkYWRlKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICAgICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkQ29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihjb25kX2VsZXRfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmR1dGl2aWRhZGUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDE5OTAtMjAwMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkQ29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IHBlcmlvZG8yLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihjb25kX2VsZXRfcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmR1dGl2aWRhZGUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkQ29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihjb25kX2VsZXRfcDMgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmR1dGl2aWRhZGUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDIwMTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkQ29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKGNvbmRfZWxldF9wMSwgY29uZF9lbGV0X3AyLCBjb25kX2VsZXRfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIGNvbmRfZWxldCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHN1bV9jb25kX2VsZXRfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KENPRElHTywgQ29uZHV0aXZpZGFkZSwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShDb25kdXRpdmlkYWRlLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKENvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKENvbmR1dGl2aWRhZGUsIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9jb25kX2VsZXRfcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIENvbmR1dGl2aWRhZGUsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoQ29uZHV0aXZpZGFkZSwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKENvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShDb25kdXRpdmlkYWRlLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2NvbmRfZWxldF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgQ29uZHV0aXZpZGFkZSwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShDb25kdXRpdmlkYWRlLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKENvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKENvbmR1dGl2aWRhZGUsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBuID0gDQogICAgICAgIGxlbmd0aChDb25kdXRpdmlkYWRlKSkNCikNCg0KIyBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgICBzZWxlY3QoQ09ESUdPLCBJUUEpICU+JSANCiMgICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQojICAgIHN1bW1hcml6ZSgNCiMgICAgICAgbWluID0gDQojICAgICAgICAgIG1pbihJUUEsIA0KIyAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgcTEgPSANCiMgICAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjI1LCANCiMgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgbWVkaWFuID0gDQojICAgICAgICAgIG1lZGlhbihJUUEsIA0KIyAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgbWVhbiA9IA0KIyAgICAgICAgICBtZWFuKElRQSwgDQojICAgICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KIyAgICAgICBxMyA9IA0KIyAgICAgICAgICBxdWFudGlsZShJUUEsIDAuNzUsIA0KIyAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgICBtYXggPSANCiMgICAgICAgICAgbWF4KElRQSwgDQojICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIGNvbmRfZWxldCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dzYXZlKCJjb25kX2VsZXQucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGNvbmRfZWxldCwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJjb25kX2VsZXRfcDEucG5nIiwNCiAgICAgICBwbG90ID0gY29uZF9lbGV0X3AxLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImNvbmRfZWxldF9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBjb25kX2VsZXRfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiY29uZF9lbGV0X3AzLnBuZyIsDQogICAgICAgcGxvdCA9IGNvbmRfZWxldF9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJjb25kX2VsZXRfM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UoY29uZF9lbGV0X3AxLCBjb25kX2VsZXRfcDIsIGNvbmRfZWxldF9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpgYGANCg0KDQojIyBUZXh0YW5kbyBvIHRleHRvDQoNCiogwqcgZmFsYXIgZG8gY29tcG9ydGFtZW50byBnZXJhbCBkb3MgZGFkb3MNCiogMsK6IMKnIC0geMK6IMKnIC0+IGFib3JkYXIgb3MgcHJpbmNpcGFpcyBwYXLDom1ldHJvcyBxdWUgZXN0w6NvIHNlbmRvIGltcGFjdGFkb3MsIGRldGFsaGFuZG8sIG5hcyBlc3Rhw6fDtWVzIG1haXMgcmVsZXZhbnRlcywgY29tbyBmaWNhcmFtIG9zIHF1YXJ0aXMvbWVkaWFuYSBldGMuDQoNCg0KDQpgciBzdW1fb2RfcDEkUE0xWzFdYA0KDQpPcyByZXN1bHRhZG9zIGFwb250YW0gcXVlIHBhcmEgbyBwYXLDom1ldHJvIE9EDQoNCg0KDQoNCg0KDQoNCg0KDQo=